C 程序是否会遇到未定义的行为?

C 程序是否会遇到未定义的行为?,c,compiler-warnings,undefined-behavior,C,Compiler Warnings,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); } #包括 #包括 #包括 内部主(空) { int i=2; srand(时间(空

请看以下代码:

#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);
}
#包括
#包括
#包括
内部主(空)
{
int i=2;
srand(时间(空));
如果(rand()%2==0)
i=i+++2;
printf(“%d”,i);
}
现在,这个程序的输出有时是
2
,有时是
4
(现在,这个值
4
取决于编译器,如果执行了未定义的语句
i=i+++2;
),则该值在不同的编译器上可能不同),并在这两种情况下发出警告。 因此,当我得到输出
2
语句
I=I+++2


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

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

如果您的程序中有一个有效路径和一个无效路径(如示例中所示),那么如果程序在任何时候都采用了无效路径,那么整个程序的执行都是UB

所以,如果您从未对无效语句执行过,那么您已经定义了行为



注意:我使用“无效代码”来表示可能导致UB未定义行为在运行时发生的代码,而不是在静态代码级别(如果有意义的话)

如果您的程序中有一个有效路径和一个无效路径(如示例中所示),那么如果程序在任何时候都采用了无效路径,那么整个程序的执行都是UB

所以,如果您从未对无效语句执行过,那么您已经定义了行为



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

警告只是编译器发出的诊断消息,C规范可能强制执行,也可能不强制执行。但是,编译器发出的警告消息并不意味着它不会尝试为程序生成代码,也不意味着忽略警告。作为程序员,你有责任确保你传递给编译器的代码中没有UB。@一些程序员伙计,在我得到输出
2
的情况下,行为是否未定义?@usr这里的问题是,这个问题中的代码与重复问题中的代码有一点不同,并且特别是由于
rand()
函数。如果代码实际未执行或执行了,则应单独查看。我们不知道。有了这一点,就不能说代码没有被执行。也许有点具体,但有一个显著的区别。@roberts-supportsmonicacellio它有两种情况:分支何时被取下,何时不被取下。当树枝被拿走的时候,它显然是被拿走的。因此,问题是当分支未被执行时是否为UB,这是dupe中要解决的问题。警告只是编译器发出的诊断消息,C规范可能强制执行,也可能不强制执行。但是,编译器发出的警告消息并不意味着它不会尝试为程序生成代码,也不意味着忽略警告。作为程序员,你有责任确保你传递给编译器的代码中没有UB。@一些程序员伙计,在我得到输出
2
的情况下,行为是否未定义?@usr这里的问题是,这个问题中的代码与重复问题中的代码有一点不同,并且特别是由于
rand()
函数。如果代码实际未执行或执行了,则应单独查看。我们不知道。有了这一点,就不能说代码没有被执行。也许有点具体,但有一个显著的区别。@roberts-supportsmonicacellio它有两种情况:分支何时被取下,何时不被取下。当树枝被拿走的时候,它显然是被拿走的。所以问题是,当分支未被占用时,它是否为UB,这就是dupe中所述的。