C语言字母统计代码疑问:字符比较逻辑及数组计数操作原理
代码逻辑疑问解答
1. 初始c=0的判断逻辑
你问:初始时c的值为0,而ASCII码中'a'对应的十进制值为97,是否初始状态下所有if判断条件都不会成立?
这个判断是正确的。C语言中字符常量本质是对应ASCII码的整数值,初始c=0时:
- 既不满足小写字母区间
c >= 'a' && c <= 'z'(对应ASCII值97~122) - 也不满足大写字母区间
c >= 'A' && c <= 'Z'(对应ASCII值65~90) - 也不等于换行符
'\n'(对应ASCII值10)
所以第一次执行循环体时会直接进入else分支,给统计其他字符的A[26]额外加1,这属于当前代码的逻辑小瑕疵,原因是do-while会先执行循环体,再执行while条件里的fgetc读取字符赋值给c,第一次循环用的是初始的无效值0。
2. 字符与'a'比较的运行逻辑
c >= 'a' && c <= 'z'这行代码的作用是判断当前读取到的字符是否为小写字母:
- 程序运行到后续循环时,
c已经被while ((c = fgetc(data1)) != EOF)赋值为从文件读取到的字符的ASCII值 - 直接用
c和字符常量'a'、'z'比较,本质就是判断c的整数值是否落在小写字母对应的ASCII区间内,写法比直接写97、122可读性更强。
3. A[c]++的功能
你定义的int A[27] = {0}是计数数组,每个元素的作用如下:
A[0]`A[25]`:分别对应字母az的出现次数A[26]:统计非字母、非换行的其他字符的出现次数
当判断c是小写字母时,执行c -= 'a':比如当前字符是'a'(ASCII值97),减'a'后得到0,就对应A[0],执行A[c]++就是把a的计数加1;如果字符是'z'(ASCII值122),减'a'后得到25,对应A[25],即z的计数加1。
大写字母的逻辑同理,c -= 'A'后同样得到0~25的下标,大小写字母会统一计数到同一个数组下标中。
内容的提问来源于stack exchange,提问作者skruf922
相关产品推荐
相关产品推荐

