鱼C论坛

 找回密码
 立即注册
查看: 5647|回复: 15

求高手指教此句的意思以及括号的作用!

[复制链接]
发表于 2013-9-10 10:14:08 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 With_You 于 2013-9-10 11:26 编辑

题目:
译密码,将字母A变成E,a变成e,即变成其后的4个字母。
字母按上述规律转换,非字母保持不变。
从键盘输入一行字符,要求输入其相应密码。

书上答案入下:
#include<stdio.h>
int main()
{
  char c;  
  while ( (c=getchar()) != '\n')
  {
   if((c>='a' && c<='z') || (c>='A' && c<='Z'))
   {
    c=c+4;
       if(c>='Z' && c<='Z'+4 || c>'z')
    c=c-26;
   }
   printf("%c",c);
  }
  printf("\n");
  return 0;
}

绿色的地方我无法理解是什么意思,求帮忙解释下。


还有就是蓝色标示的地方,我一开始输入的时候忘用括号把 c=getchar() 括上了,
即打出来是这样  while (c=getchar() !='\n'
然后程序运行以后出来的居然是笑脸符号 123123.jpg
我想知道为什么会这样呢
一样的地方我用的一样的颜色,不一样的地方就是那个大红色的括号我都标记出来了,求高手分别帮忙解说一下,谢谢。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2013-9-10 10:21:47 | 显示全部楼层
!=关系运算符的优先级大于=赋值语句的优先级。。。
PS:我猜的。。。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-10 11:26:39 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-9-10 11:29:48 | 显示全部楼层
1.
if((c>='a' && c<='z') || (c>='A' && c<='Z'))
   {
    c=c+4;
       if(c>='Z' && c<='Z'+4 || c>'z')
    c=c-26;
   }



很简单啊,第一个if,是判断c是否为大小写字母,如果为,就c=c+4;这个时候,c已经+4了。

第二个if,if(c>='Z' && c<='Z'+4 || c>'z')  ,主要的作用是如果你输入的是WXYZ,+4,不就跑到如右这个ASCII码去了-->[ \ ] ^,

所以必须让c=c-26; ,[其实这句c>='Z' && c<='Z'+4 || c>'z'已经错了,如果你输入的是大写V,就会变成乱码]

---->要改成c>'Z' && c<='Z'+4 || c>'z',为什么这样,就不解释了,太简单了。





打个比方吧:你如果输入的是字符X,在计算机里,用10进制表示,就是88,那通过第一个IF后,c=92,那就变成了字符'\',而不是你想要的字符B,这个时候,就必须用第二个IF,来判断输入的是否是后面四个字母WXYZ,如果是再减去26,因为ascii码里,A为65,后面字母递增而来。至于c>'z',为什么不要c<='z'+4 那是因为基本的ASCII码总共只有128位[0-127],而这上z,是122,加不加都没有关系,因为第一个if后,c=c+4,那就是说小写的'z',已经到126位,第127位是DEL,所以可以直接用c>'z',只要大于'z',就直接c=c-26;就可以跑到a去了,和大写原理一样。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-9-10 11:35:08 | 显示全部楼层
2 while ( (c=getchar()) != '\n')
这其实没什么好讲的,这个涉及到算术优先级的问题,没有那个大括号,c就变成取真还是取假的呢。就取0还是取1的去了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-10 12:03:06 | 显示全部楼层
liangfei44 发表于 2013-9-10 11:29
1.
if((c>='a' && c='A' && c='Z' && c'z')
    c=c-26;

我就是不明白为什么判断它是不是在最后4个字符却没有用到最后4个字符来判断,我能理解
if(c>='w' && C<='z' || c>='W' && c<='Z')
   c=c-26;
但却无法理解为什么上面的全是用Z来判断的,这才是我纠结的地方啊亲。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-9-10 12:40:26 | 显示全部楼层
本帖最后由 liangfei44 于 2013-9-10 12:44 编辑

去看一下,ASCII码,a-z,A-Z的数字,就知道了!

c=c+4;
这个时候,c的值已经改变了, 他已经加4了,这个时候,你输入的W,已经变成Z了,而Z=Z+4了!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-9-10 13:41:11 | 显示全部楼层
本帖最后由 福禄娃娃 于 2013-9-10 13:42 编辑

蓝色部分少加一个括号优先级改变了
while ( (c=getchar()) != '\n') 加了括号是把c的值与回车'\n'做比较,判断用户是否输入回车用于结束输入
while ( c=getchar() != '\n')   少了括号先把用户输入的字符与'\n'做比较,再赋值给c,所以c始终为1,1在ASCII表中为一个笑脸。

红色部分用于比较c是否大于‘Z’并且c小于'Z'+4,判断C是否已经超出了字母表,如果超出了字母表则减26再循环回来,又从大A或者小a开始。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-9-10 13:48:22 | 显示全部楼层
while ( (c=getchar()) != '\n') 这个的意思是只要从键盘输入的字符不是回车则重新输入
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-10 13:51:19 | 显示全部楼层
福禄娃娃 发表于 2013-9-10 13:41
蓝色部分少加一个括号优先级改变了
while ( (c=getchar()) != '\n') 加了括号是把c的值与回车'\n'做比较, ...

这下终于明白为什么打出来老是笑脸了,谢谢啦。


不过第二个还是不太明白。不纠结它了,到后面多遇到几次一个就好了,谢谢谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-9-10 14:37:32 | 显示全部楼层
我晕,真是浪费我的时间和精力,以后问题懒得回答了!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-9-10 21:42:10 | 显示全部楼层
路过、、、
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-9-11 09:03:22 | 显示全部楼层
路过了,好多答案了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-11 09:40:15 | 显示全部楼层
liangfei44 发表于 2013-9-10 12:40
去看一下,ASCII码,a-z,A-Z的数字,就知道了!

c=c+4;

明白了明白了,谢谢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-11 09:41:41 | 显示全部楼层
liangfei44 发表于 2013-9-10 14:37
我晕,真是浪费我的时间和精力,以后问题懒得回答了!

哈哈,火气不要那么大嘛,我今天才看到你帮我解答的回答,我一下就明白了,要早看到我也不会那么纠结了,我这种新手菜鸟就需要你这样的高手来指点啊,不要生气哦,谢谢谢谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-11 09:46:09 | 显示全部楼层
liangfei44 发表于 2013-9-10 11:29
1.
if((c>='a' && c='A' && c='Z' && c'z')
    c=c-26;

嗯嗯,就是能稍微讲得浅显一些就更好了,三克油!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-11-6 07:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表