代码如下:
_Bool field0;
char field1;
printf("fieldX: [%d]\t[%d]\n", field0, field1);
printf("fieldX ? 1 : 0: [%d]\t[%d]\n", field0 ? 1 : 0, field1 ? 1 : 0);
printf("!fieldX: [%d]\t[%d]\n", !field0, !field1);
printf("!!fieldX: [%d]\t[%d]\n", !!field0, !!field1);
提供以下输出:
fieldX: [165] [165]
fieldX ? 1 : 0: [165] [1]
!fieldX: [164] [0]
!!fieldX: [165] [1]
看起来相当令人惊讶,尤其是三元运算符的结果。
与gcc 4.9.3和4.8.3一起检查,-O0,无-flto。
备注:堆栈以前是用0xa5模式初始化的(嵌入式C环境)。
最佳答案
使用自动存储访问未初始化的对象将调用未定义的行为所以这里没什么奇怪的。
而且_Bool
对象只能包含两个值:要么0
要么1
允许实现用!!boolean_object
替换boolean_object ? 1 : 0
或boolean_object
。
(还要注意,即使使用-O0
,gcc
仍在执行一些优化:例如,它内联调用一次的静态函数。)