Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 什么';这项行动太违法了_C_Sequence Points - Fatal编程技术网

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”),因此顺序从一个方向开始,然后转向另一个方向。