揭开“cout
在最近的一次采访,一个神秘的编码难题浮出水面:
int a = 0; cout << a++ << a;
有诱人的选项可供选择,包括 10、01,以及神秘的“未定义行为”,受访者自信地选择了 01,理由是他们对序列点的理解。然而,面试官的回答却让人大吃一惊:正确答案竟然是未定义的。
探索未定义的领域
序列点通常保证在之前完成副作用进入后续评估。有趣的是,所讨论的陈述在参数评估之间不具有任何序列点。这意味着参数“a”可以在参数“cout
C 17 中的一线希望
C 17 中的编码格局已经发生了转变,其中修改了表达评估规则。最新指南明确规定,在移位运算符表达式中,第一个参数(“E1”)的所有计算和副作用都在第二个参数(“E2”)的计算和副作用之前排序。
这一关键调整要求有问题的代码片段输出 01。难以捉摸的未定义行为已被消除,取而代之的是预定结果的确定性。
更深层次的深入探讨 P0145R3 的余烬
对于那些寻求更全面理解的人,技术论文 P0145R3:细化 Idiomatic C 的表达式求值顺序深入研究了修订后的表达式求值顺序的复杂细节,提供了深刻的见解深入了解 C 编码范式的演变。
以上是是`cout的详细内容。更多信息请关注PHP中文网其他相关文章!