忽略变量的类型,像a=b=c
这样的表达式在C和C ++中都定义了行为吗?
如果是的话,任何人都可以给我官方证据,比如标准中的引号吗?
P.S。我搜索了链接的任务,但我得到的是关联性,但我没有在C99标准中找到任何关于它的文本。也许我做错了?希望有人能帮助我。
答案 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)条:
赋值表达式具有赋值后的左操作数的值,[...]
与评估的正确关联性以及假设非易失性a
,b
和c
一起,这意味着a = b = c
等同于a = (b = c)
},再次相当于b = c; a = b
。