Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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++ 我是+;=++;i C+中未定义的行为+;0x?_C++_C++11_Undefined Behavior_Compound Assignment - Fatal编程技术网

C++ 我是+;=++;i C+中未定义的行为+;0x?

C++ 我是+;=++;i C+中未定义的行为+;0x?,c++,c++11,undefined-behavior,compound-assignment,C++,C++11,Undefined Behavior,Compound Assignment,我对我发现的解释非常确信,就C++0x而言,我无法判断I++=+I的行为是否定义良好。任何接受者?使i=++i定义明确的推理同样可以用来证明i+=++i也必须定义明确 i+=++i相当于i+=(i+=1),新的排序规则要求赋值发生在i+=1子表达式的值计算之前。 这意味着表达式i+=++i的结果必须与i=2*i+1的结果相同 编辑:我必须修改我的答案,因为行为毕竟是未定义的。 i++=++i的行为未定义,因为子表达式i(左侧参数)和++i的值计算彼此不排序,其中一个包含对象i的更新 对于表达式i

我对我发现的解释非常确信,就C++0x而言,我无法判断
I++=+I
的行为是否定义良好。任何接受者?

使
i=++i
定义明确的推理同样可以用来证明
i+=++i
也必须定义明确

i+=++i
相当于
i+=(i+=1)
,新的排序规则要求赋值发生在
i+=1
子表达式的值计算之前。
这意味着表达式
i+=++i
的结果必须与
i=2*i+1
的结果相同

编辑:我必须修改我的答案,因为行为毕竟是未定义的。
i++=++i
的行为未定义,因为子表达式
i
(左侧参数)和
++i
的值计算彼此不排序,其中一个包含对象
i
的更新

对于表达式
i=++i
,这不是问题,因为左侧的
i
没有进行左值到右值的转换,这在
i+=++i
情况下确实发生



另一方面:不要在任何严肃的项目中编写这样的代码。它过于依赖于准确地了解排序规则,而会有许多人要么不正确地理解排序规则,要么不知道规则的变化是637博士的结果,要么因为遗漏了所讨论表达的一些重要方面而被绊倒(正如我在撰写本答案的第一次修订版时所发生的那样).

g++说是的,它是UB。@KennyTM:我有4.5.0版,它警告我连I=++I都没有定义。你使用的是什么版本?你在没有警告的情况下成功编译I=++I了吗?I=++I和I++I都是UB@Armen:i=++i在C++0x中定义得很好。@Armen:您可能想阅读i++++i,它将等同于i=i+++i;例如我只被计算一次。但是,它定义了我或++我中的哪一个首先被计算吗?@Saurabh:你是对的。
i=++i
i+=++i
之间的区别是左侧
i
的值计算,它与
++i
不排序。这使得结果未定义。我将更新我的答案因此,@Bart我想知道“在所有情况下,作业都是按顺序排列的…”确切的意思是什么。“作业”到底是什么意思?复合转让是一种转让。我们可以说复合转让由prvalue评估和副作用组成吗?不过,我同意你的解释。但我不打赌。此外,我希望措辞更清楚一点。“形式为E1 op=E2的表达式的行为等同于E1=E1 op E2,只是E1只计算一次。”@Johannes:The“只计算一次。”“表示必须同时进行glvalue和prvalue评估,或者prvalue评估必须使用glvalue评估的结果。如果E1包含副作用(例如,当它是函数调用时),则副作用可能只发生一次。