c - 棘手的表达式评估

标签 c

我有这个代码:

  int main()
    {
       int a=1,b=2,c=3;
       printf("%d\n",a+=(a+=3,5,a));


       return 0;
    }

结果打印8。这怎么可能?

第1步中,取出a+=3后,a=a+3变为a=4

在第 2 步中,a+=(a+=3) 我到达了 a=a+(4),因此 a=4+4=8 。这样移动我没有成功使 a+=(a+=3,5,a)等于 8。

最佳答案

逗号运算符既是一个序列点,又定义了求值顺序(如 C 规范第 6.5.17 节中所述)。该运算符计算左侧操作数,然后计算右侧操作数并生成右侧操作数的值。

让我们来分解一下:

(a+=3,5,a)

这会将 a 加 3,然后得出右手的值,即:

5, a

它将把 5 评估为 5,然后丢弃它。然后它将评估 a,然后产生值 a(即 4)。剩下的就变成了:

a+=4

将 4 添加到 a,然后生成 a 的新值,即 8。

注意:这可能是未定义的行为,请参阅下面 Vlad 的回答。

关于c - 棘手的表达式评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27215686/

相关文章:

c - C中获取strstr之前和之后的文本

C 编程中二元运算符错误

C-Linux : list sparse files and print 0-filled disk blocks

c - 第二次使用 sqlite3_prepare_v2 时 SQLite 崩溃

c++ - 将多参数函数传递给宏

c - 我正在检查目录中的文件,如果找不到我会抛出错误,否则我会打印匹配项

c - 一个简单的功能需要用10种不同的方式实现

c - 用 C 实现的解释器中的垃圾收集问题

c - 在 Swift 中使用类型时如何排除 C 枚举大小写

c - 如何通过指针获取数组的大小?