C和C++中未定义,未指定和实现定义的行为有什么区别?
c c++ undefined-behavior unspecified-behavior implementation-defined-behavior
这是一个例子来说明我的问题,其中涉及一些我不能在这里发布的更复杂的代码.
#include <stdio.h>
int main()
{
int a = 0;
for (int i = 0; i < 3; i++)
{
printf("Hello\n");
a = a + 1000000000;
}
}
Run Code Online (Sandbox Code Playgroud)
这个程序在我的平台上包含未定义的行为,因为它a会在第3个循环中溢出.
这是否会使整个程序具有未定义的行为,或者仅在溢出实际发生之后?编译器是否可能a 会解决溢出问题,因此它可以声明整个循环未定义,并且不会打扰运行printfs,即使它们都在溢出之前发生?
(标记为C和C++,即使它们不同,因为如果它们不同,我会对这两种语言的答案感兴趣.)
当我尝试除以0时,下面的代码没有捕获异常.我是否需要抛出异常,或者计算机是否在运行时自动抛出一个异常?
int i = 0;
cin >> i; // what if someone enters zero?
try {
i = 5/i;
}
catch (std::logic_error e) {
cerr << e.what();
}
Run Code Online (Sandbox Code Playgroud) 我正在进行长时间的模拟.我将结果记录到矢量中以计算有关数据的统计数据.我意识到,从理论上讲,这些样本可能是零除的结果; 这只是理论上的,我很确定情况并非如此.为了避免在修改代码后重新运行模拟,我想知道在这种情况下会发生什么.我是否能够意识到是否发生了0分裂?我会收到错误消息吗?(暂时没有处理例外情况).
谢谢