为什么C语言中'A' <= inp[i] <= 'Z'比较结果始终为真?
C语言链式比较运算异常原因解析
首先复现问题代码:
#include <stdio.h> #define MAXLEN 1000 void lowerrr(char inp[]); //BQhiuIGEIBEIuo2jehgUIGIUGIUg3iuoOgklOIhp__rvknzioUFIU#Gnf% int main(){ char inp[] = "BQhiuIGEIBEIuo2jehgUIGIUGIUg3iuoOgklOIhp__rvknzioUFIU#Gnf"; lowerrr(inp); printf("%s",inp); return 0; } void lowerrr(char inp[]){ for (int i = 0; inp[i] != '\0'; ++i){ printf("%d", ('A' <= inp[i] <= 'Z'));//always true //printf("%d", (inp[i] >= 'A' && inp[i] <= 'Z')); work normaly (inp[i] >= 'A' && inp[i] <= 'Z') ? inp[i]+= 'a' - 'A' : inp[i] ; } }
异常原因
该表现是C语言的运算符规则决定的,不存在语法错误,只是运行逻辑不符合预期:
- C语言中
<、<=、>、>=这类关系运算符是左结合的,且运算返回值为整数类型:条件成立返回1,不成立返回0。 - 表达式
'A' <= inp[i] <= 'Z'会被编译器拆分为两步执行:- 先计算
'A' <= inp[i],得到结果0或者1 - 再将第一步的结果和
'Z'比较,也就是执行0 <= 'Z'或者1 <= 'Z'
- 先计算
- 字符
'Z'的ASCII码值为90,0和1都远小于90,所以第二步的运算结果永远为1,也就是整个表达式永远为真。
正确写法的逻辑
inp[i] >= 'A' && inp[i] <= 'Z'使用了逻辑与运算符&&:
&&会先后验证左右两个比较表达式的结果,只有两个表达式的结果都为1(真)时,整个表达式的返回值才为1,否则为0,刚好匹配判断字符是否属于大写字母区间的需求,所以可以正常运行。
内容的提问来源于stack exchange,提问作者Inc.ace
相关产品推荐
相关产品推荐

