为什么这是相同的,文档在哪里支持这一点?
我的老师坚持"z = ( y++ )“应该首先执行y++,然后将结果归因于z。
所以就像这样:
int z, y = 10;
z = (y++);
printf("%d", z); //z = 10 or 11? and why?谢谢。
发布于 2016-10-27 19:12:17
你的老师错了。在C中,语句z = (y++);和z = y++;必须是等价的。
根据section 6.5.2.4 of N1570 (C11的标准草案):
后缀++运算符的结果是操作数的值。作为一个副作用,操作数对象的值是递增的(也就是说,适当类型的值1加到它上面)。..。在更新操作数的存储值的副作用之前,对结果的值计算进行排序。
后缀++运算符和括号都有相同的值:它们只传递操作数的值。因此,y、y++、(y)、(y++)和(y)++都有相同的值:计算表达式时y的值。
后缀++唯一的不同之处在于,它在计算操作数(紧接在其之前的表达式)之后的某个时候会产生副作用。在z = (y++); printf("%d", z);的情况下,后缀++会产生副作用
表达式y的值之后的
printf("%d", z);语句之前的是除此之外,你不能控制什么时候y 被修改为。这也是为什么像z = y++ = y++这样的语句具有未定义的行为:第一个y++的副作用可能发生在第二个y++的副作用之前、期间或之后。
发布于 2016-10-27 18:55:54
是的是一样的。这由标准C中的运算符优先级规则保证,ISO9899:2011 6.5/3。括号是具有最高优先级(6.5.1)的主表达式,高于后缀++运算符(6.5.2),后者又高于=运算符(6.5.16)。
这意味着所有这些都是100%等价的:
z = y++;
(z) = y++;
z = (y++);
(z) = (y++);
(z = y++);所有这些情况都将计算y,将该值赋给z,然后将y递增1。
(后缀++行为被定义为:“在更新操作数的存储值的副作用之前,对结果的值计算进行排序。”)
但是请注意,将++运算符与其他运算符混合使用被认为是不好的做法,因为它具有更新值的内置副作用。这很容易产生bug,例如y=y++;可能是一个严重的bug。此外,单行上的多个运算符通常很难阅读。
因此,编写该表达式的规范方法是:
z = y;
y++;发布于 2016-10-27 18:37:05
只有当表达式中有更多的运算符时,括号的优点才会显现出来,即在一个运算池中,括号中的运算是首先执行的
int z, y = 10;
z = (y++);
printf("%d", z);在你的程序中,括号与增量运算符没有任何关系。递增发生在赋值之后(因为后递增),因此输出是10
https://stackoverflow.com/questions/40282254
复制相似问题