这是一个例子来说明我的问题,其中涉及一些更复杂的代码,我不能在这里发布.

#include <stdio.h>
int main()
{
    int a = 0;
    for (int i = 0; i < 3; i++)
    {
        printf("Hello\n");
        a = a + 1000000000;
    }
}

此程序在我的平台上包含未定义的行为,因为a将在第三个循环中溢出.

这是否使whole program具有未定义的行为,或者仅在overflow actually happens之后?编译器是否有可能计算出awill溢出,这样它就可以声明整个循环未定义,而不会费心运行printfs,即使它们都发生在溢出之前?

(标记C和C++虽然不同,因为如果两种语言不同,我会对它们的答案感兴趣).sub>

推荐答案

如果你对纯理论答案感兴趣,C++标准允许"不规则行为""时间旅行":

[intro.execution]/5:

因此,如果您的程序包含未定义的行为,那么您的whole program的行为也是未定义的.

C++相关问答推荐

为什么在传输 Big Data 时共享内存段的运行时间比管道更长?

如何在C中只使用一个带双方括号([i][j])访问语法的malloc来分配动态大小的2d数组?

为什么删除CAP_DAC_OVERRIDE后创建文件失败?

模拟shell并运行.sh文件

VS代码';S C/C++扩展称C23真关键字和假关键字未定义

用gcc-msse 2编译的C程序包含AVX 1指令

用C语言计算文本文件中的整数个数

我的C函数起作用了,但我不确定为什么

初始成员、公共初始序列、匿名联合和严格别名如何在C中交互?

从CentOS 7到Raspberry PI 2B的交叉编译-无法让LIBC和System Include标头一起工作

C++中PUTS函数的返回值

不带Malloc的链表

为什么会出现此错误?二进制表达式的操作数无效

程序对大输入给出错误答案

意外的C并集结果

浮点正零何时不全为零?

将不同类型的指针传递给函数(C)

c如何传递对 struct 数组的引用,而不是设置 struct 的副本

execve 不给出which命令的输出

C Makefile - 如何避免重复提及文件名