程序会遇到未定义的行为吗?

Will the program encounter an undefined behavior?

看下面的代码:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(void) 
{
    int i = 2;
    srand(time(NULL));
    if (rand() % 2 == 0)
        i = i++ + 2;
    printf("%d", i);
}

现在,这个程序的输出有时是 2 而有时是 4——(现在,这个值 4 取决于编译器,并且这个值在不同的编译器,前提是 undefined statement i = i++ + 2; 被执行)——在这两种情况下都会发出警告。 因此,当我得到输出 2 时,编译器不会执行语句 i = i++ + 2;

那么我的程序在那种情况下是否也会遇到未定义的行为,即使由于编译器(在我的例子中是 GCC)发出警告而未执行该语句?

未定义的行为发生在运行时,而不是在静态代码级别,如果这有意义的话。

如果您的程序中有一个有效路径和一个无效路径,就像您的示例中那样,如果程序在任何时候采用无效路径,则整个程序的执行都是 UB。

因此,如果您从不执行无效语句,那么您就定义了行为。


注意:我使用 "invalid code" 表示会导致 UB

的代码