一、《关于一个bool变量既是true又是false这件事》
// C/C++ code.
bool _;
if (_)
puts("_ is true.");
if (!_)
puts("_ is false.");
有可能会同时输出_ is true.
和_ is false.
出现_
即是true
又是false
的原因就是:
_
即不是true
又不是false
。
他到底是不是true
和false
?
“如是”。
因为我们忘记初始化_
导致_
为2
。
cout << _
为2
(不使用boolalpha
是为了看看它到底是什么)这里的
boolalpha
打了cppreference的中文链接
没错,我在试图教会你
2
吗?是的!
if (2)
里会执行
!_
吗?是的!
编译器只对合法标量负责。
一个值为
10
的布尔变量== 0
得到一个值为11
的布尔变量(gcc
)
这是就有同学要说了:
“你运气怎么这么好,_
刚好是 2
?”
其实可以手动修改,*(unsigned char *)&_ = 2;
可以手动让 _
的值为 2
二、《关于一个 int
变量比 INT_MAX
还大》
bool foo(int x)
{
return x + 1 > x;
}
在进行 -O2
优化下,有可能得到如下汇编指令:
foo:
mov eax 0x1
ret
翻译成 C++ 就是:
int foo(int x)
{
return true;
}
这时就有同学说了:
“不对啊,foo(INT_MAX)
在优化前是 false
,咋开个优化就变成 true
了?”
要回答这个问题,首先我们得从 INT_MAX + 1
是多少说起。
“INT_MIN
呀!”
吗?
C++ 标准定义:有符号整数溢出算作未定义行为 (UB),而无符号整数溢出永远 % (TYPE(1u) << sizeof(TYPE))
(TYPE
指这个无符号整数的类型)
未定义行为 (UB)可以让编译器想干什么就干什么,当然可以让 INT_MAX + 1 > INT_MAX
啦!