|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
各位鱼油好!
我在做S1E13动动手第0题的时候遇到了两个问题,希望鱼油们能帮我解惑。(题在下面)
我写的代码如下:
- #include<stdio.h>
- int main()
- {
- int count = 0;
- int a;
- printf("请输入一行英文句子:");
- while ((a = getchar()) != '\n') {
- if ('A'<=a<='Z') { //我的第一个疑惑
- count ++;
- printf("%d\n",a); //我的第二个疑惑
- }
- }
- printf("总计打了%d个大写字母\n", count);
- return 0;
- }
复制代码
输出结果如下图:
我的第一个疑惑是: 我在一开始尝试了 'A'<=a<='Z'的写法之后发现不行,于是改成了 a >='A' & a <= 'Z', 发现结果正常,但是我奇怪为什么 所有字符都满足 'A'<=a<='Z'的判断?
我的第二个疑惑是: 我在查错的时候,加入了第二个疑惑那一行代码,发现结果会在输入完字符后按回车,依次打印了所有字符的ASCII码。但是我按逻辑推下来, 结果应该是 : 我输入一个字符,它判断满足if条件之后打印字符对应的ASCII码,而不是在我按回车跳出循环后 一次打印全部啊?为什么啊?
希望鱼油们能帮我解惑。
if('A'<=a<='Z') // 在C语言中可以这样写,但是几乎可以肯定结果不是你想要的,因为这是C语言,不是数学,在数学中可以这样写,在C语言中不行,你这样写,C语言会给你解释成另一个意思
具体看下面的代码
- #include <stdio.h>
- int main(void)
- {
- char ch = '3';
- if('A' <= ch <= 'Z')
- {
- printf("%c\n", ch);
- }
- return 0;
- }
- /*
- 3
- 请按任意键继续. . .
- */
复制代码
在你看来,这个代码不会输出3,但是的确输出了3,因为这个代码完全不是按照你所想的那样工作的,因为这是C语言,不是数学
在C语言中上面这个代码被解释成了下面这个样子
- #include <stdio.h>
- int main(void)
- {
- char ch = '3';
- if(('A' <= ch) <= 'Z')
- {
- printf("%c\n", ch);
- }
- return 0;
- }
- /*
- 3
- 请按任意键继续. . .
- */
复制代码
对,你没有看错
先判断字符'A'是不是小于等于ch,得到的结果要么是‘是’,要么是‘否’,也就是,要么是0,要么是1(在这里用0表示否,用1表示是)
然后再用0或者是1和字符‘Z’进行判断,看看是不是小于等于,结果显而易见
因为
0 <= 'Z'
1 <= 'Z'
因为'Z'的ASCII值是0x5A
也就是
0 <= 0x5A
1 <= 0x5A
这两个都是对的,也就是if中的语句会执行
所以输出3就没有什么好奇怪的了
- if('A' <= ch <= 'Z')
- 00EA183C movsx eax,byte ptr [ch]
- 00EA1840 cmp eax,41h
- 00EA1843 jl main+41h (0EA1851h)
- 00EA1845 mov dword ptr [ebp-0D0h],1
- 00EA184F jmp main+4Bh (0EA185Bh)
- 00EA1851 mov dword ptr [ebp-0D0h],0
- 00EA185B cmp dword ptr [ebp-0D0h],5Ah
- 00EA1862 jg main+66h (0EA1876h)
- if(('A' <= ch) <= 'Z')
- 00DF183C movsx eax,byte ptr [ch]
- 00DF1840 cmp eax,41h
- 00DF1843 jl main+41h (0DF1851h)
- 00DF1845 mov dword ptr [ebp-0D0h],1
- 00DF184F jmp main+4Bh (0DF185Bh)
- 00DF1851 mov dword ptr [ebp-0D0h],0
- 00DF185B cmp dword ptr [ebp-0D0h],5Ah
- 00DF1862 jg main+66h (0DF1876h)
复制代码
可以看到if('A' <= ch <= 'Z')就相当于if(('A' <= ch) <= 'Z')
最后,再一次说明,这是C语言,不是数学,不能把数学中的东西照搬过来
|
|