代码如下:

_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 : 0boolean_object
(还要注意,即使使用-O0gcc仍在执行一些优化:例如,它内联调用一次的静态函数。)

08-18 11:31