58得票7回答
在C++中,++x %= 10是否有明确定义?

在查看某个项目的代码时,我遇到了以下语句:++x %= 10; 这个语句在C++中是否被定义良好,还是与之前提到的同类问题?a[i] = i++ ?

58得票3回答
初始化是否包含左值到右值的转换?`int x = x;`是未定义行为吗?

C++标准中包含一个半著名的例子,涉及3.3.2中的“声明点”的“惊人”名称查找。int x = x; 这将使用自身初始化x,由于其是一个原始类型,因此是未初始化的,因此具有不确定的值(假设它是一种自动变量)。 这实际上是未定义行为吗? 根据4.1节“左值到右值转换”,在未初始化的值上执行...

57得票5回答
a[a[0]] = 1会产生未定义行为吗?

这段C99代码是否会产生未定义的行为?#include <stdio.h> int main() { int a[3] = {0, 0, 0}; a[a[0]] = 1; printf("a[0] = %d\n", a[0]); return 0; } 在语句a[...

57得票1回答
为什么代码会通过空指针显式调用静态方法?

我在几个旧项目中见过这样的代码:class Class { static void Method() {} }; ((Class*)0)->Method(); 这段代码包含未定义的行为,因为它包括对空指针进行解引用(无论之后发生什么)。这真的没有意义 - 强制转换存在是为了向编...

57得票10回答
为什么将a = (a+b) - (b=a)用于交换两个整数是不好的选择?

我偶然发现了这个代码,可以在不使用临时变量或按位运算符的情况下交换两个整数。int main(){ int a=2,b=3; printf("a=%d,b=%d",a,b); a=(a+b)-(b=a); printf("\na=%d,b=%d",a,b); ...

55得票8回答
当左侧操作数为负值时,为什么左移操作会引发未定义行为?

在C语言中,当左操作数为负值时,按位左移操作将会导致未定义的行为。 引用自ISO C99 (6.5.7/4): E1 << E2 的结果是E1向左移动E2个二进制位,空出的位用0填充。如果E1的类型是无符号的,那么结果的值为E1乘以2的E2次方,然后对结果类型所能表示的最...

55得票3回答
std::memcpy在不同的trivially copyable类型之间是否是未定义行为?

我一直在使用std::memcpy来规避严格别名问题。 例如,检查一个float,像这个: float f = ...; uint32_t i; static_assert(sizeof(f)==sizeof(i)); std::memcpy(&i, &f, sizeof(...

54得票7回答
C#中未定义行为的代码

在C++中,你可以用很多方式编写代码并将其编译,但这些代码可能会导致未定义行为 (维基百科)。那么在C#中是否存在类似的情况?我们能否编写可编译但具有未定义行为的C#代码?

54得票3回答
操作...可能未定义?

我有以下的代码FRAME frameArray[5][10]; // Create the array of frames int trackBufferFull[5] = {0, 0, 0, 0, 0};// Keeps track of how full the buffer for ea...

54得票3回答
在C99中,f()+g()是未定义的还是仅仅是未指定的?

我曾经认为在C99中,即使函数f和g的副作用相互干扰,且表达式f() + g()不包含序列点,f和g仍然包含一些序列点,因此行为会是未指定的:要么先调用f(),要么先调用g()。 但现在我不太确定了。如果编译器内联这些函数(即使这些函数没有声明为inline,编译器可能决定进行内联优化),并...