c - 了解 C 中的后增量概念

标签 c assembly undefined-behavior sequence-points

考虑下面的代码:

#include <stdio.h>

int main()
{
    int x=0,y=5;
    printf("x=%d,x_1=%d,sum=%d",x++,x,y+x);
    return 0;
}

我对这段代码的假设是,x 将打印为 0,稍后在后增量 x_1 将是 1,y+x 将是 5+1=6

实际结果是x如预期的那样为0,x_1如预期的那样为1。但是 y+x 是 5。我不确定为什么 x 保留了它以前的值,尽管发生了后增量。你能帮忙澄清一下吗? 我同样使用 gcc 编译器。

最佳答案

printf("x=%d,x_1=%d,sum=%d", x++, x, y+x);
//                           (a) (b)  (b)

您正在更新 x (a) 并在同一表达式中使用它的值 (b)(没有插入序列点)。
那是未定义的行为。

尝试

printf("x=%d,x_1=%d,sum=%d", x, x + 1, y + x + 1);
x++;

关于c - 了解 C 中的后增量概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58656310/

相关文章:

c++ - 这是无限递归UB吗?

c - 将链表中的数据写入C中的txt文件

c - C 中的类型转换和类型安全

c - 为什么 sigchld_handler 也会收到 SIGTSTP?

assembly - 无法从 kernel.s 打印,即使它已加载到内存中

c++ - C++03 12.4/12 中关于通过指针显式调用基类析构函数的说法是什么?

c - cuda共享内存静态分配错误

objective-c - Mac 上汇编语言的纯函数

上下文保存——如何读取C中的段寄存器和指令指针?

c - 在同一个函数中,通过间接访问访问不在范围内的局部变量是否是 UB?