c - 完全理解前缀自增(++)操作

标签 c

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

foo(0) -- 2   /* 1*2 */
foo(2) -- 12  /* 3*4 */
foo(4) -- 30  /* 5*6 */

但是我有

foo(2) -- 4
foo(4) -- 16
foo(6) -- 36

相反。有人可以向我解释发生了什么吗?

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);
}

最佳答案

一旦你在一个变量上使用了++——前缀或后缀——你就不能在同一个变量上再次使用它,直到下一个sequence point之后。 .如果这样做,代码的行为是未定义的——允许编译器做任何它想做的事

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

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

关于c - 完全理解前缀自增(++)操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5812230/

相关文章:

c - 静态定义对性能、代码内存大小和数据内存大小的影响?

c - 这段代码使用函数有什么问题?

c - 在参数中带有字符串的函数

c - .txt 保存并命名文件

c - 为什么我的堆栈返回 null?

c - Lua 垃圾回收 : Will reassigned userdata have its __gc meta event triggered?

c - 在套接字上设置超时不起作用

c++ - C++中的 Mongoose 服务器

C 错误, "' 预期为 '=' ',' ';' 、 'asm' 或 '__attribute__' 之前 'Bufferpar' "

c - 如何解释 linux 内核陷阱错误行?