C语言中someElements |= array[i] == 'y'语句工作原理解析
关于
someElements |= array[i] == 'y'语句的生效原理 这段程序会在数组部分元素为'y'或全部元素为'n'时显示对应消息。我的问题是关于这行代码:someElements |= array[i] == 'y',我知道它可以写成someElements = someElements | array[i] == 'y',想请教为什么这个语句能够生效?
#include <stdio.h> int main() { char array[3] = { 0 }; int i; for (i = 0; i < 3; i++) { do { printf("\nElement No.%d [y/n]: ", i + 1); scanf(" %c", &array[i]); if (array[i] != 'y' && array[i] != 'n') { printf("Must be a lowercase 'y' or 'n'\n"); } } while (array[i] != 'y' && array[i] != 'n'); } int someElements = 0; for (i = 0; i < 3; i++) { someElements |= array[i] == 'y'; } if (someElements) { printf("\nSOME of the elements = y.\n"); } else{ printf("\nNONE of the elements = y.\n"); } return 0; }
为什么这行代码能生效?
拆解来看,核心是三个关键点:
C语言中关系表达式的整数结果
在C里,array[i] == 'y'这类关系判断的结果是整数:条件成立(元素为'y')时返回1,不成立则返回0。按位或赋值运算符
|=的逻辑someElements |= x等价于someElements = someElements | x,按位或的规则是:只要两个操作数的对应二进制位有一个是1,结果的该位就是1。
这里someElements初始值为0,每次循环和array[i] == 'y'的结果(0或1)做按位或:
- 若数组里至少有一个元素是'y',某次循环会得到
1,此时0 | 1 = 1;后续不管循环得到0还是1,1 | 0或1 | 1的结果都是1,someElements会一直保持非0状态。 - 若数组所有元素都是'n',每次循环得到的都是
0,0 | 0始终是0,someElements保持为0。
- 条件判断的整数规则
C语言中,非0整数在if条件里会被视为“真”,0则被视为“假”。所以后续的if (someElements)判断:
- 当
someElements为1(存在'y'元素)时,条件成立,输出对应提示; - 当
someElements为0(全是'n')时,进入else分支,输出另一条提示。
另外补充:运算符优先级在这里起到了关键作用,==的优先级高于|,所以会先计算array[i] == 'y'得到0或1,再和someElements做按位或,无需加括号也能保证逻辑正确。
内容的提问来源于stack exchange,提问作者SSY
相关产品推荐
相关产品推荐

