71得票3回答
多线程程序在优化模式下卡住,但在-O0模式下正常运行

我编写了一个简单的多线程程序,如下所示:static bool finished = false; int func() { size_t i = 0; while (!finished) ++i; return i; } int main() { ...

70得票8回答
使用“memcpy”复制2D数组在技术上是否属于未定义行为?

在这个最近的问题的评论中,出现了一个有趣的讨论:虽然那里使用的语言是C,但讨论已经转向了C++标准,在使用像std::memcpy这样的函数访问多维数组元素时,什么构成了未定义行为。 首先,这是来自那个问题的代码,转换为C ++并尽可能使用const:#include <iostream...

67得票1回答
C++标准在C++14中是否对使用未确定值和未定义行为进行了更改?

如《初始化是否涉及lvalue到rvalue转换? int x = x;是否UB?》中所述,C++标准在第3.3.2节声明点中有一个令人惊讶的示例,在其中使用未确定的值初始化了一个int: int x = 12; { int x = x; } 根据Johannes的回答,这个问题的答案表明它...

66得票3回答
在C++中,用自身初始化全局变量是否具有未定义行为?

int i = i; int main() { int a = a; return 0; } int a = a 肯定具有未定义行为(UB),更多细节可以在 Is reading an uninitialized value always an undefined behaviou...

64得票4回答
编译器优化可能导致整数溢出。这样做可以吗?

我有一个 int x。为简化起见,假设 int 占用的范围为 -2^31 到 2^31-1。我想计算 2*x-1。我允许 x 为任何值,满足 0 <= x <= 2^30。如果我计算 2*(2^30),就会发生整数溢出。 一种解决方案是计算 2*(x-1)+1。这里比我想要的多了...

64得票5回答
为什么C编译器不能优化在假定两个指向相同变量的指针是非法/未定义行为的情况下改变const指针值?

最近我看到了一篇Rust和C的比较文章,其中使用了以下代码: bool f(int* a, const int* b) { *a = 2; int ret = *b; *a = 3; return ret != 0; } 在Rust中(相同的代码,但使用Rust语法),它...

62得票8回答
访问全局数组超出其边界是否是未定义行为?

我今天在课堂上参加了一场考试,内容是阅读C代码和输入,并要求回答程序实际运行时屏幕上会显示什么。其中一个问题将a[4][4]定义为全局变量,并在程序的某个点尝试访问a[27][27],所以我回答类似于“访问超出数组边界的行为是未定义的”(参考自这里),但老师说a[27][27]的值将为0。 ...

59得票2回答
为什么这是未定义行为?

我对这个问题的回答是这个函数:inline bool divisible15(unsigned int x) { //286331153 = (2^32 - 1) / 15 //4008636143 = (2^32) - 286331153 return x * 40...

59得票10回答
C++中的有符号数溢出和未定义行为(UB)

我想了解以下代码的使用int result = 0; int factor = 1; for (...) { result = ... factor *= 10; } return result; 如果循环迭代了n次,则factor将被乘以10,恰好n次。然而,在被乘以10的总...

59得票7回答
浮点除零的行为

请考虑#include <iostream> int main() { double a = 1.0 / 0; double b = -1.0 / 0; double c = 0.0 / 0; std::cout << a <&lt...