You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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'会被编译器拆分为两步执行:
    1. 先计算'A' <= inp[i],得到结果0或者1
    2. 再将第一步的结果和'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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.14 09:27:02