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

mar*_*wei 7 c c++ variable-assignment assignment-operator

忽略变量的类型,表达式a=b=c是否已在C和C++中定义了行为?

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

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

Vla*_*cow 9

来自C++标准

5.17赋值和复合赋值运算符[expr.ass] 1赋值运算符(=)和复合赋值运算符从右到左分组.所有都需要一个可修改的左值作为左操作数,并返回一个左值操作数的左值.如果左操作数是位字段,则所有情况下的结果都是位字段.在所有情况下,在右和左操作数的值计算之后,以及在赋值表达式的值计算之前,对赋值进行排序.

还有一个例子

int a, b;
a = b = { 1 }; // meaning a=b=1;
Run Code Online (Sandbox Code Playgroud)

来自C标准

6.5.16赋值运算符语义3赋值运算符将值存储在左操作数指定的对象中.赋值表达式在赋值后具有左操作数的值,111) 但不是左值.赋值表达式的类型是左值操作数在左值转换后将具有的类型.在左右操作数的值计算之后,对更新左操作数的存储值的副作用进行排序.对操作数的评估是不确定的.

如你所见,有区别.在C++中,赋值运算符返回一个引用左操作数的左值,而在C中它返回赋值后的左操作数的值,111) 但不是左值.

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

int a, b = 20;

( a = 10 ) = b;
Run Code Online (Sandbox Code Playgroud)

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