c ++ bool异常 - 为什么这可能?

时间:2013-06-24 16:48:31

标签: c++ language-features

我偶然发现了这个问题:当postifix两次增加一个bool时,整数值仍然是1而不是预期的2.我想知道为什么会发生这种情况。

bool test = false; // results in integer 0
test++; // results in integer 1
test++; // results in integer 1

// but there still is at least one byte of memory used:
// results in integer 137
*(unsigned char*)(&test) = 137;

3 个答案:

答案 0 :(得分:8)

这是指定++运算符的方式。参见C ++11§5.2.6[expr.post.incr] / 1(强调我的):

  

后缀++表达式的值是其操作数的值。 [注意:获得的值是原始值的副本-end note]操作数应该是可修改的左值。操作数的类型应为算术类型或指向完整对象类型的指针。

     

操作数对象的值通过向其添加1来修改,除非对象的类型为bool,在这种情况下它设置为true。 [注意:此用法已弃用,请参阅附件D.-注意事项]

(前缀++运算符具有相似的语言,可以将其应用于bool值。)

通过bool以外的类型的指针或引用修改bool对象会产生未定义的行为。

答案 1 :(得分:0)

  

为什么这可能??

未定义的行为就是 - 未定义。任何事情都可能发生。

  

如果分配了足够的137内存,那么为什么地狱test++;结果为1

语言规范定义了这种行为。

答案 2 :(得分:0)

因为您通过将指针转换为其他类型并对其执行读/写来调用未定义的行为。 UB =任何事情都可能发生,包括鼻子恶魔。