为什么gcc不会在代码里面的未定义行为中发出警告?

hal*_*lex 7 c c++ gcc compiler-warnings sequence-points

我刚读了这篇关于未定义行为和序列点的SO C++ FAQ,并进行了一些实验.在下面的代码中gcc-4.5.2,只在代码注释中提到的行中给出了警告,尽管之前的一行也显示了未定义的行为,不是吗?您不能说首先执行哪个加法操作数(因为+没有序列点).为什么gcc也没有在这一行给我一个警告?

int i=0;
int j=0;

int foo(void) {
    i=1;
    return i;
}

int main(void) {
    i = i + foo(); 
    j = j + (j=1); //Here is a rightly warning
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮忙.

小智 16

i = i + foo()的行为; 未指定但未定义.未定义意味着允许任何可能的行为,甚至中止程序.未指定意味着首先评估i,或者foo().是的,foo写到同一个i,但由于它发生在一个单独的语句中,所以在该商店之前和之后都有一个序列点.