![]() |
1
70
语言律师问题。Hmkay。 我的个人TOP3:
编辑 下面是一个两次出错的小例子: (假设32位整数和小尾数)
该代码试图通过直接在浮点表示中使用符号位逐位旋转来获取浮点的绝对值。 但是,通过从一个类型转换到另一个类型来创建指向对象的指针的结果是无效的C。编译器可能会假定指向不同类型的指针不指向同一块内存。这对于除void*和char*之外的所有类型的指针都是正确的(符号不重要)。 在上面的例子中,我做了两次。一次获取float A的int别名,一次将值转换回float。 有三种有效的方法可以做到这一点。 在转换期间使用char或void指针。这些都是任何事物的别名,所以它们是安全的。
使用MeMe副本。memcpy使用空指针,因此它也将强制进行混叠。
第三种有效方法:使用联合。这是明确的 自C99起未定义:
|
![]() |
2
30
我个人最喜欢的未定义行为是,如果一个非空源文件没有以换行符结尾,那么行为是未定义的。 我怀疑这是真的,尽管没有一个编译器会根据源文件是否被换行终止而区别对待它,除了发出警告。因此,这并不是真正让不知情的程序员感到惊讶的事情,而是他们可能会对警告感到惊讶。 因此,对于真正的可移植性问题(这些问题主要取决于实现,而不是未指定或未定义,但我认为这符合问题的精神):
非常严重的问题,即使在您开发的平台上也会令人惊讶,因为行为只是部分未定义/未指定的:
我认为尼尔斯顺便提过:
|
![]() |
3
22
用指向某物的指针来划分某物。只是因为某种原因不能编译…-)
|
![]() |
4
19
我最喜欢的是:
回答一些意见,根据标准,这是未定义的行为。看到这一点,编译器可以对硬盘进行任何格式化(包括格式化)。 参见例如 this comment here .关键不是你能看到对某些行为可能有一个合理的预期。由于C++标准和序列点被定义的方式,这段代码实际上是未定义的行为。
例如,如果我们
所以我们应该在后面看到x==2。然而,这并不是真的,您会发现一些编译器在后面的x==1,甚至x==3。您将不得不仔细查看生成的程序集,以了解这可能是为什么,但这些差异是由于底层问题造成的。本质上,我认为这是因为编译器可以按照它喜欢的任何顺序计算这两个赋值语句,所以它可以
|
![]() |
5
10
我遇到的另一个问题(已定义,但绝对出乎意料)。 炭是邪恶的。
|
![]() |
6
8
我无法计算更正printf格式说明符以匹配其参数的次数。 任何不匹配都是未定义的行为 .
|
![]() |
7
7
如果函数原型不可用,编译器不必告诉您调用的函数参数个数错误/参数类型错误。 |
![]() |
8
6
我见过很多相对缺乏经验的程序员被多字符常量咬伤。 这是:
是字符串文本(类型为
这是:
是普通字符常量(出于历史原因,它属于类型
这是:
也是一个完全合法的字符常量,但它的值(仍然是类型
|
![]() |
9
4
Clang开发者发布了一些 great examples 不久前,在一篇文章中,每个C程序员都应该阅读。一些有趣的事情之前没有提到:
|
![]() |
10
2
EE在这里刚刚发现A>>-2有点担心。 我点点头告诉他们这不自然。 |
![]() |
11
1
一定要在使用变量之前初始化它们!当我刚开始使用C时,这引起了我很多头痛。 |
![]() |
12
0
使用“max”或“isupper”等函数的宏版本。宏对它们的参数进行了两次评估,因此当调用max(++i,j)或isupper(*p++)时,会得到意外的副作用。 以上是标准C。在C++中,这些问题基本上消失了。max函数现在是一个模板化函数。 |
![]() |
13
-1
忘记添加
|
![]() |
MaPo · Linux,设置锁定ICMP_过滤器选项 5 月前 |
![]() |
Doohyeon Won · 内联函数上的奇怪现象?[关闭] 5 月前 |
![]() |
Bobby · 复合字面值总是左值吗? 6 月前 |
![]() |
9-Pin · C: 嵌套结构的堆栈内存分配 6 月前 |