C++程序员应该知道的所有常见未定义行为是什么?

200

一个C++程序员应该知道的常见未定义行为有哪些?

例如:

a[i] = i++;


3
你确定吗?那看起来很明确。 - Martin York
17
6.2.2 评估顺序 [expr.evaluation] 在 C++ 编程语言中是这样说的。我没有其他参考资料。 - yesraaj
4
他是正确的。我刚看了《C++程序设计语言》6.2.2章节,它说v[i] = i++是未定义的。 - dancavallaro
4
我猜测是因为编译器会在计算v[i]的内存位置之前或之后执行i++操作。虽然i始终会被赋值,但它可能会将值写入v[i]或v[i+1]中,这取决于操作顺序。 - Evan Teran
2
这些天来,对于版主来说,似乎成了一种必经之路,即强制关闭一个受欢迎的问题,甚至是那些灰色地带的问题(比如这个问题),而这些问题本应由整个社区决定,而不是一个过于热衷的单个版主。 - BlueRaja - Danny Pflughoeft
显示剩余6条评论
11个回答

2

C++只保证char类型有固定的大小,为1。其他所有类型的大小都取决于平台。


那不是<cstdint>库的作用吗?它定义了诸如uint16_6之类的类型。 - Jasper Bekkers
这不是未定义行为。标准规定符合要求的平台定义了大小,而不是标准定义它们。 - Daniel Earwicker
@JaredPar:这并不完全正确。long 保证至少有32位 - John Dibling
1
@JaredPar:这是一篇包含许多对话线程的复杂文章,因此我在这里总结了所有内容。底线是:“为了用二进制表示-2147483647和+2147483647,你需要32位。” - John Dibling
出于类似的原因,int 至少为16位,而 long long 至少为64位(在C++11标准中添加)。 - David Stone
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接