C语言中1与0是否恒为真假值?康威生命游戏代码疑问
关于康威生命游戏C代码的疑问解答
针对你提出的三个问题,结合代码逐一解释:
1. C语言中1和0是否一定代表真(true)和假(false)?
在C语言的逻辑规则里:
- 任何非零值都会被判定为“真”,并非只有1;只有0会被判定为“假”。
- 但当布尔表达式(比如
a == b)的结果作为数值输出时,C99及以后的标准规定它的结果是1(真)或0(假)。早期C89没有原生布尔类型,程序员就普遍用1和0来模拟真假值。
2. 代码中用1表示真、0表示假的理解是否正确?
你的理解完全正确。代码里的三元运算符curMap[i+1][j+1] == '*' ? 1 : 0,就是把“当前位置是存活细胞(*)”这个判断结果,转换成1(真,代表存在一个邻居)或0(假,代表无邻居),进而累加统计总邻居数。这种写法是C语言里统计条件成立次数的常用手段,本质就是用1代表条件为真的情况,0代表假,逻辑完全通顺。
3. 代码为何没有使用bool类型?
主要有三个原因:
- 兼容性需求:这段代码大概率是基于C89标准编写的,而C89没有原生的
bool类型——_Bool是C99才引入的,bool作为别名还需要包含<stdbool.h>头文件。用1和0不需要依赖任何头文件,能兼容更老的编译环境。 - 场景匹配性:代码用
char类型的*和空格直接存储细胞的存活/死亡状态,字符操作比布尔值更直观,没必要额外转换类型。而统计邻居数量时需要整数计数,用1和0累加比布尔值转整数更直接高效。 - 代码简洁性:用1和0模拟真假已经足够满足这里的逻辑需求,引入布尔类型反而会增加不必要的复杂度。
附上你提供的代码:
void iterGen(int WIDTH, int HEIGHT, char curMap[WIDTH][HEIGHT]) { int i, j; char tempMap[WIDTH][HEIGHT]; for (i = 0; i < WIDTH; i++) { for (j = 0; j < HEIGHT; j++) { int neighbors = 0; neighbors += curMap[i+1][j+1] == '*' ? 1 : 0; neighbors += curMap[i+1][j] == '*' ? 1 : 0; neighbors += curMap[i+1][j-1] == '*' ? 1 : 0; neighbors += curMap[i][j+1] == '*' ? 1 : 0; neighbors += curMap[i][j-1] == '*' ? 1 : 0; neighbors += curMap[i-1][j+1] == '*' ? 1 : 0; neighbors += curMap[i-1][j] == '*' ? 1 : 0; neighbors += curMap[i-1][j-1] == '*' ? 1 : 0; if (curMap[i][j] == ' ') { tempMap[i][j] = neighbors == 3 ? '*' : ' '; } else if (curMap[i][j] == '*') { tempMap[i][j] = neighbors < 2 || neighbors > 3 ? ' ' : '*'; } } } for (i = 0; i < WIDTH; i++) { for (j = 0; j < HEIGHT; j++) { curMap[i][j] = tempMap[i][j]; } } }
内容的提问来源于stack exchange,提问作者Stacy
相关产品推荐
相关产品推荐

