前后增量混淆

时间:2019-04-14 16:28:45

标签: c

我尝试运行此程序:

#include<stdio.h>
int main(){
        int a=5;
        printf("%d %d", ++a,a++);
        return 0;
}

在armv7设备上的arch-chroot中使用gcc。我期望得到输出7 5,但我得到7 6。谁能解释发生了什么事?running the program

2 个答案:

答案 0 :(得分:3)

您的代码正在调用未定义行为(UB)!

在编译期间使用警告flgas -Wall -Wextra,编译器会告诉您这个故事:

prog.c: In function 'main':
prog.c:4:30: warning: operation on 'a' may be undefined [-Wsequence-point]
    4 |         printf("%d %d", ++a,a++);
      |                             ~^~
7 5

在那个 online demo 中,我得到了不同的输出,它是UB的特征。

printf and ++ operator中了解更多信息。

答案 1 :(得分:1)

6.5p2

  

如果相对于任何一个标量对象的副作用未排序   对相同标量对象或值的不同副作用   使用相同标量对象的值进行计算,其行为是   未定义。如果存在多个允许的排序   表达式的子表达式,如果这样的行为   在任何顺序中都会发生无序的副作用。84)

++aa++未排序。您的程序格式错误。