是否在C / C ++中定义了链接未定义的行为?

时间:2014-03-24 12:12:41

标签: c++ c variable-assignment assignment-operator

忽略变量的类型,像a=b=c这样的表达式在C和C ++中都定义了行为吗?

如果是的话,任何人都可以给我官方证据,比如标准中的引号吗?

P.S。我搜索了链接的任务,但我得到的是关联性,但我没有在C99标准中找到任何关于它的文本。也许我做错了?希望有人能帮助我。

4 个答案:

答案 0 :(得分:8)

来自C ++标准

  

5.17赋值和复合赋值运算符[expr.ass] 1赋值运算符(=)和复合赋值运算符   小组从右到左。所有都需要左侧可修改的左值   操作数和返回引用左操作数的左值。结果   在所有情况下,如果左操作数是位字段,则是位字段。在所有   在这种情况下,赋值在值的计算之后排序   左右操作数,以及之前的值计算   作业表达。

来自那里的一个例子

int a, b;
a = b = { 1 }; // meaning a=b=1;

来自C标准

  

6.5.16赋值运算符语义3赋值运算符将值存储在左操作数指定的对象中。作业   expression具有赋值后左操作数的值,111)   但不是左值。赋值表达式的类型是类型   左值操作数将在左值转换后出现。副作用   更新左操作数的存储值的顺序排在后面   左右操作数的值计算。评估   操作数没有排序。

如你所见,存在差异。在C ++中,赋值运算符返回引用左操作数的左值,而在C中它返回赋值后左操作数的值,111) 但不是左值

这意味着在C ++中,以下代码有效

int a, b = 20;

( a = 10 ) = b;

在C语言中,编译器应发出错误。

答案 1 :(得分:1)

关于结合性。您可以将a=b=c重写为a=(b=c)。赋值(b=c)的结果是最后指定的变量(b)的值。

答案 2 :(得分:1)

It C和C ++,赋值是右关联的,也是表达式,所以

a=b=c;

被视为:

a=(b=c);

表达式b=c评估分配后b中的任何内容。请注意,我说“不管怎么样”(因为它可能(但不可取)在C ++中提供一个分配功能来执行其他任务!

答案 3 :(得分:1)

根据C99第6.5.16(3)条:

  

赋值表达式具有赋值后的左操作数的值,[...]

与评估的正确关联性以及假设非易失性abc一起,这意味着a = b = c等同于a = (b = c) },再次相当于b = c; a = b