程序会遇到未定义的行为吗?
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
的代码
看下面的代码:
#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
的代码