【发布时间】:2020-05-06 08:12:44
【问题描述】:
看下面的代码:
#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)发出警告而未执行该语句?
【问题讨论】:
-
警告只是编译器发出的诊断消息,C 规范可能会也可能不会强制要求。但是来自编译器的警告消息并不意味着它不会尝试为程序生成代码,或者忽略它警告的内容。作为程序员,您有责任确保您传递给编译器的代码中没有 UB。
-
@Some 程序员老兄那么对于我得到输出
2的情况,行为是否未定义? -
@usr 这里的问题是这个问题中的代码与重复问题中的代码有很大不同,尤其是因为
rand()函数。如果代码实际上没有被执行,或者如果它被执行,则应单独查看。我们无法知道。这样一来,就不能提到代码没有被执行。可能有点具体,但有显着差异。 -
@RobertSsupportsMonicaCellio 有两种情况:何时采用分支,何时不采用。取分支时,显然是UB。所以问题是当分支没有被占用时它是否是UB,这就是欺骗中解决的问题。
标签: c compiler-warnings undefined-behavior