C 什么';这项行动太违法了
即与此类似的代码,使打印输出未定义C 什么';这项行动太违法了,c,sequence-points,C,Sequence Points,即与此类似的代码,使打印输出未定义 int a=41; a++ & printf("%d\n", a); 我不知道这个手术到底叫什么 问题在于没有指定先评估哪个,即printf或a++,并且由于一个对另一个有副作用(你要么读a,然后写它,然后再读它,或者读它,然后再写它),你会得到未定义的行为。请注意,a++&printf(“%d\n”,a);定义得很好,因为&引入了一个序列点-&&的左操作数保证总是在右操作数之前求值(如果LHO为false,甚至不会求值).@MitchWheat:如
int a=41; a++ & printf("%d\n", a);
我不知道这个手术到底叫什么 问题在于没有指定先评估哪个,即
printf
或a++
,并且由于一个对另一个有副作用(你要么读a
,然后写它,然后再读它,或者读它,然后再写它),你会得到未定义的行为。请注意,a++&printf(“%d\n”,a);
定义得很好,因为&
引入了一个序列点-&&
的左操作数保证总是在右操作数之前求值(如果LHO为false,甚至不会求值).@MitchWheat:如果我知道这个名字,我会复制它。@staginator:它在修改一个对象并读取它,而没有插入一个序列点。它经常被问到的原因是任何知道“序列点”是什么的人“means知道这个问题的答案,因此任何想知道答案的人都不知道搜索词。@stanigator如果您了解评估顺序和UB相关序列点的一个特定示例,那么您可以看到所有其他类似的UBs。@MatteoItalia肯定是,或者你不能依赖于短路计算。注意:有人观察到,有些编译器在解释代码的方式上甚至不一致。@Dietrich:也很正确。计算顺序可能取决于(例如)优化级别,或者编译器可以选择在不同上下文中可能最有效的不同顺序,这取决于编译器在执行语句时预测的指令管道状态的一些细微细节。由于顺序是未指定的,它甚至可以假设将决定权留给某种可怕的配置文件引导、代码变异的运行时优化器(又名“现代CPU”),因此顺序从一个方向开始,然后转向另一个方向。