C中赋值运算符的关联性
Posted
技术标签:
【中文标题】C中赋值运算符的关联性【英文标题】:Associativity of assignment operator in C [duplicate] 【发布时间】:2013-07-08 21:33:25 【问题描述】:我有这个代码:
#include<stdio.h>
main()
static int a[10];
int i=5;
a[i]=i++;// **statement 1**
printf("%d %d",a[6],a[5]);
我得到以下输出:
0 5
既然赋值运算符是 RTL,难道i++;
in statement 1 不应该增加,然后 a[i] 在赋值之前实际上变成 a[6] 吗?语句 1 的计算结果不是a[6]=5;
吗?
为什么 a[5] 变成了 5?
【问题讨论】:
***.com/questions/4176328/… 最好避开这段代码。 天哪,我喜欢这个网站。不到5分钟,反应惊人。就问题而言,我不知道“未定义的行为”现在会进行研究。非常感谢:) @Shivaji_Vidhale;最好阅读 this 和 this 以及 this one @DanielFischer 这个案例不是 UB。 【参考方案1】:您正在尝试访问和修改同一 sequence point 中的同一变量(即同时)。这是一种未定义的行为。
结帐this question了解更多信息。
【讨论】:
【参考方案2】:这是因为=
不是 C 语言的序列点。因此,a[i] = i++
会调用未定义的行为。
这更好地解释了here 和here(感谢 Daniel Fischer)
【讨论】:
【参考方案3】:根据语言规范,这是一种未定义的行为;)
【讨论】:
以上是关于C中赋值运算符的关联性的主要内容,如果未能解决你的问题,请参考以下文章
cpp►C++11右值引用移动语义移动构造函数移动赋值运算符