斐波纳税 发表于 2021-9-15 21:08:54

求助,代码见附图

大佬们问一下为什么红圈里的表达式始终返回真???(编译器提示的,实在琢磨不明白了)

初学c,想要实现一个输入一个英文字符判断是否大小写。为了简化代码,想直接用连不等号写成一行简短的表达式,不用其它变量参与。

但是如果把红圈内代码替换成 getchar() <= 'Z' 的时候,可以正常运行达到目的。

烦请各路大佬指点。

(第一次发帖,如有违反相关论坛发帖规定的望手下留情)

2736946915 发表于 2021-9-15 21:17:53

大概是永远为真,你需要在中键加个且(&&),
不加就是取中间的数值,然后系统会帮你强制转换成bool,>65肯定是真
你加了&&才能算的上判断

Max472 发表于 2021-9-15 21:29:12

C语言没有你说的连不等

斐波纳税 发表于 2021-9-15 21:37:24

2736946915 发表于 2021-9-15 21:17
大概是永远为真,你需要在中键加个且(&&),
不加就是取中间的数值,然后系统会帮你强制转换成bool,>65肯定 ...

不是很懂,我用的关系运算符按理来说整个表达式也应该返回逻辑值啊,假如我输入 'a',值为 97,明显不在表达式范围内,经过关系运算符的运算应该返回是假...而且我连续使用不等号,即使满足 'A' <= , 但是也不满足 <= 'Z'啊。。。

斐波纳税 发表于 2021-9-15 21:41:30

Max472 发表于 2021-9-15 21:29
C语言没有你说的连不等

可是我这里表达的连不等意思就是使用关系运算符 >, <, == 这些,这难道不符合c的运算符使用规则吗?而且我刚刚试了下 表达式3 < 4 < 5 可以返回 1, 3 < 4 > 5 返回的就是 0...可能举上面的例子不够严谨,但是这样写的话c也确实能正确执行想表达的意思...

2736946915 发表于 2021-9-15 21:46:14

斐波纳税 发表于 2021-9-15 21:37
不是很懂,我用的关系运算符按理来说整个表达式也应该返回逻辑值啊,假如我输入 'a',值为 97,明显不在 ...

想法是对的,但是表达错了,你这个叫取中间值,所以我才叫你加上&&,这个能把两个逻辑符号连起来

2736946915 发表于 2021-9-15 21:47:21

斐波纳税 发表于 2021-9-15 21:37
不是很懂,我用的关系运算符按理来说整个表达式也应该返回逻辑值啊,假如我输入 'a',值为 97,明显不在 ...

即使满足 'A' <= , 但是也不满足 <= 'Z'啊。。。
你这句话你自己不也是分开读的吗,同理,计算机他也要分开,不然他怎么知道你的意思,

斐波纳税 发表于 2021-9-15 21:50:10

2736946915 发表于 2021-9-15 21:46
想法是对的,但是表达错了,你这个叫取中间值,所以我才叫你加上&&,这个能把两个逻辑符号连起来

能讲一下取中间值是什么意思嘛?

Max472 发表于 2021-9-15 21:51:11

2736946915 发表于 2021-9-15 21:47
即使满足 'A'

行啊,这样

斐波纳税 发表于 2021-9-15 21:55:15

Max472 发表于 2021-9-15 21:51
行啊,这样

对我就是想表达这个意思,但是行不通,编译器提示表达式内容永远为真...

2736946915 发表于 2021-9-15 21:59:13

斐波纳税 发表于 2021-9-15 21:50
能讲一下取中间值是什么意思嘛?

字面的意思,就是>A,<Z,取中间的数,只要中间数不为01就是true,
或者你可以试试-1<0<1,这个中间值为0,应该就是false了,
我也没试过。。根据经验猜的,因为这样写代码会被打死的,

Max472 发表于 2021-9-15 21:59:52

斐波纳税 发表于 2021-9-15 21:55
对我就是想表达这个意思,但是行不通,编译器提示表达式内容永远为真...

https://www.codeleading.com/article/45993739759/
我之前没想过这个问题,看的视频都是用与把两个与起来,这个网址就可以解决你的问题

2736946915 发表于 2021-9-15 22:01:25

斐波纳税 发表于 2021-9-15 21:50
能讲一下取中间值是什么意思嘛?

关于false和true,只有=0才是false,其余都是true,包括负数,系统会帮你强制转换确保正常运行,只不过没在代码里面体现出来

jhanker 发表于 2021-9-15 22:06:03

斐波纳税 发表于 2021-9-15 21:55
对我就是想表达这个意思,但是行不通,编译器提示表达式内容永远为真...

其实表达式 'A'<=getchar()<='Z'是合法的,但是由于运算符是从左向右的,所以 不管输入什么 ,'A'<=getchar()返回不是0或1,而0或1都小于'Z',所以'A'<=getchar()<='Z' 永远为 真

jhanker 发表于 2021-9-15 22:06:35

所以这样的表达方式不是你的本意

2736946915 发表于 2021-9-15 22:15:37

斐波纳税 发表于 2021-9-15 21:50
能讲一下取中间值是什么意思嘛?

看汇编秒懂,得出了一个结论,举个栗子你就懂了
int b =1;
如图-a<0<b;
他这里是取-10~1之间的所有数,把它转换成一个数组,
由于大小的限制,所以只能一直覆盖前面一个元素
也就是说无论你的bool值是由b决定
b-1就是你的值

个人猜测,我也不知道对不对

斐波纳税 发表于 2021-9-15 22:19:23

2736946915 发表于 2021-9-15 21:59
字面的意思,就是>A,

!!!看懂了,我图里写的意思从左往右运算,过第一个关系运算符的时候就已经转换成逻辑值0和1了,这两个值和 ‘Z’ 相比肯定小于 'Z' 且永远成立的,实际上我想要表达的意思计算机没有能够理解...

jhanker 发表于 2021-9-15 22:20:24

斐波纳税 发表于 2021-9-15 22:19
!!!看懂了,我图里写的意思从左往右运算,过第一个关系运算符的时候就已经转换成逻辑值0和1了,这两个 ...

开窍了

斐波纳税 发表于 2021-9-15 22:31:08

jhanker 发表于 2021-9-15 22:20
开窍了

我也是看了你的回答才逐渐理解的,恍然大悟,非常感谢!!

jhanker 发表于 2021-9-15 22:33:44

我在论坛里有一些源代码下载,你可以下载去改一改,这样学习会快一些
页: [1] 2
查看完整版本: 求助,代码见附图