与-Wsequence-point启用,GCC应该在不确定的行为代码看准警告用户.例如
b = a + ++a;
Run Code Online (Sandbox Code Playgroud)
应该被GCC注意到并且应该被报告为"未定义的行为"代码(因为ISO C没有指定评估操作数的顺序).
但是,我玩了语法,我尝试了这个:
int *a = malloc(sizeof(int) * 2);
a[0] = 1;
printf("%d\n", *(a + (*a)++ - *a));
Run Code Online (Sandbox Code Playgroud)
当然,我收到了警告
警告:'*a'上的操作可能未定义[-Wsequence-point]
这是我所期望的,因为*a(a[0]可能)的值可以在处理第三个操作数时递增或者可以不递增.但是,我尝试了以下一个:
int *a = malloc(sizeof(int) * 2);
a[0] = 1;
printf("%d\n", *(a + (*a)++ - 1));
Run Code Online (Sandbox Code Playgroud)
我很惊讶,因为我没有收到任何警告.这不应该是UB吗?我的意思是,根据ISO C99,可以在表达式评估期间的任何点评估后增量操作(逗号运算符和三元运算符除外).在我的后一个例子中,我没有递增指针,而是指向它指向的整数.所以,accordning该标准,它可以在任何点(这意味着它可以整体表达式求值之后被递增)递增,因此该程序可以打印两个1或2,是吗?
为什么海湾合作委员会没有发出任何警告?还是我错过了什么?我错误地理解了这些规格吗?