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中赋值运算符的关联性的主要内容,如果未能解决你的问题,请参考以下文章

在c ++中的赋值运算符重载方法中删除旧的动态分配的内存

cpp►C++11右值引用移动语义移动构造函数移动赋值运算符

cpp►C++11右值引用移动语义移动构造函数移动赋值运算符

c语言中规定 赋值运算符的左边必须是啥?

c语言中规定 赋值运算符的左边必须是啥?

在C语言中赋值运算符有啥作用?