我偶然发现了这个问题:当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;
答案 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 =任何事情都可能发生,包括鼻子恶魔。