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++.