![]() |
1
6
除非行为不明确,
如果查看生成的程序集,您将看到该条件根本没有出现在代码中(then case也没有)。 |
![]() |
2
3
未定义的行为并不意味着“值将是任意的”。它意味着编译器可以
literally anything it wants to
. 在本例中,编译器似乎能够静态地验证
只要
你只是幸运的恶魔没有从你鼻子里出来。 参见: Undefined behavior can result in time travel , The premature downcast , Why undefined behavior may call a never-called function 以及 many many many other discussions of UB 在这里。 |
![]() |
3
1
编译器假定未定义的行为不会发生。它可以做出这样的假设,因为如果违反了约束并且行为未定义, 任何 结果是可能的,包括错误假设可能导致的结果。
如果没有未定义的行为,那么
实际打印的值
|
![]() |
4
0
c标准指出,实现通常将未定义的行为视为对编译器的邀请,使其以环境的文档化方式进行操作,而基本原理则指出,将行为分类为ub是为了获得高质量的实现。在市场需求时提供超出标准要求的功能。尽管如此,从他们的行为来看,一些编译器供应商认为让编译器寻找更聪明的方法来利用无意义地处理某些情况的自由比让他们在实际情况下采用合理约束的行为(例如_ builtin_ctz()以未指定的方式在执行CPU所做的任何操作或生成某些任意值之间进行选择)。 我个人很怀疑,任何“优化”的价值,如果允许编译器做任何事情,而不是产生一个值或执行CPU操作,无论结果如何,都会接近允许程序员假设在cpu本身不做任何奇怪事情的平台上,该操作只会产生一个未指定的结果,并且没有副作用。尽管如此,gcc的作者似乎认为,要求程序员添加额外的源代码来处理不需要额外机器代码就可以处理的情况,这将在某种程度上提高“效率”。 |