我尝试运行此程序:
#include<stdio.h>
int main(){
int a=5;
printf("%d %d", ++a,a++);
return 0;
}
在armv7设备上的arch-chroot中使用gcc。我期望得到输出7 5
,但我得到7 6
。谁能解释发生了什么事?
答案 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)
如果相对于任何一个标量对象的副作用未排序 对相同标量对象或值的不同副作用 使用相同标量对象的值进行计算,其行为是 未定义。如果存在多个允许的排序 表达式的子表达式,如果这样的行为 在任何顺序中都会发生无序的副作用。84)
++a
和a++
未排序。您的程序格式错误。