如何使用post / pre increment运算符以及其他问题?

时间:2015-08-28 23:08:42

标签: c post-increment pre-increment

 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?

2 个答案:

答案 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。类似地,++yy的增量调度为5,并计算增量值5。因此,加法增加了256和5,产生261。评估涉及xy的术语的顺序未定义,但两者都必须在添加之前进行评估(尽管在评估加法时增量可能不完整)。因为有一个序列点'当参数(和表示函数的表达式)已被计算但在调用函数之前,在调用printf()时必须完成增量。

接下来的两个语句将xy打印为2575

请注意,这两个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 ++中使用包含后递增或前递增运算符的表达式。

有关更多信息,请参见链接:
https://www.quora.com/What-does-an-expression-involving-multiple-post-pre-decrement-increment-operators-evaluate-to-in-C-and-C++#