7得票3回答
C中的序列点和副作用

在这个 C-FAQ 中,它提到了 序列点; 标准规定;在前一个和下一个序列点之间,通过表达式对对象进行的存储值修改最多一次。此外,先前的值只能被访问以确定要存储的值。 在示例中。 i = i++; a[i] = i++; 从声明的第一句话可以清楚地看出,这些示例是导致未定义行为的结果...

21得票1回答
以下是否为未定义行为?i = func(i)

我知道i=i++;是未定义行为,因为在序列点;之前,i被改变了两次。但我不知道编译器是否保证下面这种情况不是未定义行为:int func(int &i) { i++; return i; } int i = 1; i = func(i);

7得票7回答
安全地检查“this”是否为null。

首先,我知道在 null 指针上调用一个方法是未定义行为。我也知道,因为这不应该发生,编译器可以(而且确实)假设 this 总是非空的。 但在实际代码中,有时候你会不小心这样做。通常情况下,除了当然方法中的 this 是 null 并可能导致崩溃之外,它没有任何副作用。 作为一种调试辅助工...

11得票2回答
在C++中,`x-- > 0 && array[x]`是否属于良好定义的行为?

当我在布尔表达式的左侧后置增量时,可以同时在两侧使用x吗? 问题所在的行是: if(x-- > 0 && array[x]) { /* … use x … */ } 这是否是通过标准定义的?array[x]会使用新值还是旧值?

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...

76得票5回答
在C/C++中进行无符号左移操作前掩码处理是否过于谨慎?

这个问题的动机是我在C/C++中实现密码算法(例如SHA-1),编写可移植的平台无关代码,并彻底避免未定义行为。 假设一个标准化的加密算法要求你实现以下内容: b = (a << 31) & 0xFFFFFFFF a和b是无符号32位整数。请注意,在结果中,我们会...

9得票1回答
工会成员在调动后是否仍然属于活跃成员?

假设 sizeof( int ) == sizeof( float ),我有以下代码片段:union U{ int i; float f; }; U u1, u2; u1.i = 1; //i is the active member of u1 u2.f = 1.0f...

29得票3回答
将空的void*指针删除,是否属于未定义行为?

我知道delete一个空指针是无操作的: 在任何一种情况下,如果delete的操作数的值是空指针,则该操作没有效果。 (C++标准5.3.5 [expr.delete] p2) 同时,删除void*指针是未定义行为,因为析构函数不能被调用,因为没有void类型的对象: 在第一种情...

7得票3回答
使用数组地址获取数组结束位置指针

在C和C++中,使用超过数组末尾的指针编写函数来操作任意大的数组通常很有用。为了更加方便,C++提供了一个std::end重载函数。然而,在C语言中,我发现经常看到定义并使用以下宏的情况: #define ARRAYLEN(array) (sizeof(array)/sizeof(array...

72得票10回答
一个检测C++未定义行为的实现?

许多C++操作会导致未定义的行为,在这种情况下,规范完全没有说明程序应该具有什么行为,并允许发生任何事情。因此,存在各种情况,人们的代码可以在Debug但无法在Release模式下编译通过,或者在进行看似不相关的更改之前工作正常,或者在一个机器上工作但在另一个机器上不工作等等。 我的问题是是...