首页 > 解决方案 > 程序会遇到未定义的行为吗?

问题描述

看下面的代码:

#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取决于编译器,并且在不同的编译器上的值不同,前提是未定义的语句 i = i++ + 2;被执行)——在两者中都发出警告案件。因此,当我得到输出时,编译器不会执行该2语句。i = i++ + 2;

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

标签: ccompiler-warningsundefined-behavior

解决方案


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

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

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


注意:我使用“无效代码”来表示会导致 UB 的代码


推荐阅读