完全理解前缀增量(++)操作

Dea*_*ean 4 c

我有以下代码,我希望输出是:

foo(0) -- 2   /* 1*2 */
foo(2) -- 12  /* 3*4 */
foo(4) -- 30  /* 5*6 */
Run Code Online (Sandbox Code Playgroud)

但我有

foo(2) -- 4
foo(4) -- 16
foo(6) -- 36
Run Code Online (Sandbox Code Playgroud)

代替.有人可以向我解释发生了什么吗?

include <stdio.h>

int main()
{
    int counter;    /* counter for loop */

    counter = 0;

    while (counter < 5)
        printf("foo(%d) -- %d\n", counter, ((++counter)*(++counter)));

    return (0);
}
Run Code Online (Sandbox Code Playgroud)

zwo*_*wol 13

一旦你++对变量使用了- 前缀或后缀 - 就不能在同一个变量上再次使用它,直到下一个序列点之后.如果这样做,代码的行为是未定义的 - 编译器可以做任何想做的事情.

(++counter)代码中的两个表达式之间没有序列点,因此您违反了此规则.你必须写这样的东西,而不是:

while (counter < 5) {
    printf("foo(%d) -- %d\n", counter, (counter+1) * (counter+2));
    counter += 2;
}
Run Code Online (Sandbox Code Playgroud)

  • 很好的解释. (3认同)