main(){
int x = 256, y = 4;
printf("%d\n\n", x++ + ++y); //output = 261
printf("%d\n\n", x); // output = 257
printf("%d", y); // output = 5
}
最终答案是261,因为256 - > 257(邮政运营商)和5 - > 5(前算子)导致256 + 5 = 261?
答案 0 :(得分:3)
假设:
int x = 256, y = 4;
printf("%d\n\n", x++ + ++y);
简而言之: x++
返回值256
,然后将x
增加到257. ++y
增量y
到5并返回值5
。因此,添加会增加256和5,从而产生261
。
啰嗦: x++
评估x
的当前值256
,并将x
的增量调度为257。类似地,++y
将y
的增量调度为5,并计算增量值5
。因此,加法增加了256和5,产生261
。评估涉及x
和y
的术语的顺序未定义,但两者都必须在添加之前进行评估(尽管在评估加法时增量可能不完整)。因为有一个序列点'当参数(和表示函数的表达式)已被计算但在调用函数之前,在调用printf()
时必须完成增量。
接下来的两个语句将x
和y
打印为257
和5
。
请注意,这两个printf()
操作可以合并为一个。在不调用未定义行为的情况下,两者都不能与第一个组合。 (有关此主题的更多信息,请参阅Multiple increments and undefined behaviour。)
所以,考虑到我不会像你写的那样表达它,你似乎有正确的解释。
此外,标准C现在要求所有功能的返回类型已超过15年(因为C99已标准化)。你应该写:
int main(void)
表示不带参数的main()
函数。 (有关详细信息,请参阅What should main()
return in C and C++?。)
请注意,此问题仅调用完全定义的行为(至少在printf()
语句中)。它不询问序列点之间单个变量的多个增量。
答案 1 :(得分:0)
在您的情况下,我们无法确定是先评估x ++还是先评估++ y。它取决于编译器。
因此,请勿在C或C ++中使用包含后递增或前递增运算符的表达式。