105得票7回答
使用未初始化的变量为什么是未定义行为?

如果我有:unsigned int x; x -= x; 很明显,在此表达式之后,x 应该 是零,但无论我查看哪里,它们都说此代码的 行为 是未定义的,不仅仅是 x 的值(在减法之前)。 两个问题: 这段代码的 行为 确实是未定义的吗? (例如,在符合标准的系统上,代码可能会崩溃[或更糟...

105得票9回答
“未定义行为”是否真的允许发生“任何”事情?

“未定义行为”的典型谬误例子是“鼻涕妖”,这是一种物理不可能性,无论C和C++标准允许什么。 因为C和C++社区往往非常强调未定义行为的不可预测性以及编译器在遇到未定义行为时可以使程序做任何事情的想法,我原以为标准对于未定义行为的行为没有任何限制。 但是,C++标准中的相关引用似乎是: ...

102得票2回答
在C++20之前,使用malloc分配int类型内存是否未定义行为?

我被告知在C++20之前,以下代码存在未定义的行为:int *p = (int*)malloc(sizeof(int)); *p = 10; 那是真的吗? 争论的焦点在于在给 int 对象赋值之前,它的生命周期尚未开始 (P0593R6)。为了解决这个问题,应该使用放置 new:int *p ...

99得票13回答
在C/C++中检测有符号整数溢出

乍一看,这个问题可能看起来像是如何检测整数溢出?的重复,但实际上它有明显的不同。 我发现,虽然检测无符号整数溢出非常简单,但检测C/C ++中的有符号溢出实际上比大多数人想象的要困难得多。 最明显但很幼稚的方法可能是:int add(int lhs, int rhs) { int sum...

98得票3回答
在C++中,带符号整数溢出仍然是未定义行为吗?

我们知道,有符号整数溢出是未定义的行为。但在 C++11 的 cstdint 文档中有一些有趣的内容: 有符号整数类型,宽度分别为 8、16、32 和 64 位,没有填充位,并且对于负值使用2的补码(仅当实现直接支持该类型时提供) 查看链接 我的问题是:由于标准明确规定对于 int8...

94得票3回答
使用%p打印空指针是未定义的行为吗?

使用%p格式说明符打印空指针是否未定义行为?#include <stdio.h> int main(void) { void *p = NULL; printf("%p", p); return 0; } 该问题适用于C标准,而非C实现。

92得票5回答
为什么一个已定义数组范围以外的第一个元素默认值为零?

我正在为C ++课程的期末考试而学习。 我们的教授为我们提供了以下练习问题: 解释为什么此代码会产生以下输出:120 200 16 0 using namespace std; int main() { int x[] = {120, 200, 16}; for (int i = 0...

92得票8回答
分支语句中含有未定义行为的代码可以被认为是不可达的并进行优化成死代码吗?

考虑以下陈述:*((char*)NULL) = 0; //undefined behavior 这明显涉及未定义的行为。在给定程序中存在这样的语句是否意味着整个程序是未定义的,还是只有控制流程到达此语句时行为变得未定义? 如果用户从未输入数字3,那么下面的程序是否定义良好?while (tr...

89得票10回答
为什么printf("%f",0)会产生未定义的行为?

这个声明printf("%f\n",0.0f); 打印出0。 然而,这个语句printf("%f\n",0); 打印随机值。我意识到我正在表现出某种未定义的行为,但我无法确定具体原因。所有位都是0的浮点值仍然是一个有效的值为0的float。float和int在我的机器上是相同大小的(如果这甚...

86得票12回答
在循环中,整数溢出何时变为未定义行为?

这是一个示例,用来说明我的问题,其中涉及了一些更加复杂的代码,我无法在这里发布。#include <stdio.h> int main() { int a = 0; for (int i = 0; i < 3; i++) { print...