我猜测你的疑问是:a的第一个打印为啥是1,b的打印为啥不是1而是扫描值5?
我认为这是c编译器的特点吧,可以这么理解:
首先定义的时候bool一个变量,如果直接赋值是非零,编译器就自动转转为1了(这里是预编译阶段)。所以一开始就是1而不是2。之后有a的2次打印。最后一句判断a是0就不打印的。
然后说b,虽然定义了bool,但是扫描时候是按照int扫描的,内存中真的就是5了(并没有让编译器自动转换为1,因为是代码执行阶段了,不像预编译阶段那样自动转换)。
额外的,如果你给b减1的话,第一次减1结果b就变成1了(可以理解bool值变动时,如果发现大于1了,就减至1)。
以上都是习惯性的理解,没有什么特别的原理。就认为是编译器的动作吧,公理!
作为判断条件时,c语言的规则是非0即真。
即只要a的值不是0,都符合if条件。