-1

我只是偶然发现了这一点:当 postifix 将布尔值增加两次时,整数值仍然是 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;
4

3 回答 3

8

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

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

操作数对象的值通过加 1 来修改,除非该对象是 bool 类型,在这种情况下它被设置为 true。[注意:此用法已弃用,请参见附录 D。-结束注释]

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

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

于 2013-06-24T16:52:08.900 回答
0

为什么会这样?!

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

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

语言规范定义了该行为。

于 2013-06-24T16:50:50.090 回答
0

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

于 2013-06-24T16:51:53.180 回答