为什么在括号中包含增量运算符没有区别?

use*_*882 3 c increment parentheses

为什么会这样,文档备份在哪里呢?

我的老师坚持认为"z =(y ++)"应首先执行y ++,然后将结果归因于z.

像这样:

int z, y = 10;
z = (y++);
printf("%d", z); //z = 10 or 11? and why?
Run Code Online (Sandbox Code Playgroud)

谢谢.

小智 6

你的老师错了.在C语言中,语句z = (y++);z = y++;必须等同.

根据N1570第6.5.2.4节(C11的标准草案):

后缀++运算符的结果是操作数的值.作为副作用,操作数对象的值递增(即,将相应类型的值1添加到其中).[...]在更新操作数的存储值的副作用之前,对结果的值计算进行排序.

后缀++运算符和括号都具有相同的值:它们只传递其操作数的值.所以y,y++,(y),(y++),并且(y)++都具有相同的价值:价值y在该表达式evaluted的时间.

postfix唯一++不同的是,它在计算其操作数(紧接在它之前的表达式)之后的某个时候会产生副作用.在这种情况下z = (y++); printf("%d", z);,++将发生后缀的副作用

  • 表达式的值y被"计算"之后(在这种情况下它实际上只是读取变量),和
  • 之前printf("%d", z);说法,因为复合语句(大括号之间的语句中的任何列表)有排序的语义.

除此之外,在完全y修改时你无法控制.这也是一个声明z = y++ = y++具有未定义行为的原因:第一个的副作用y++可能发生在第二个副作用之前或期间或之后y++.