C++不明白的代码

来源:百度知道 编辑:UC知道 时间:2024/06/18 18:33:59
#include<iostream>
using namespace std;
int main()
{char c;
while((c=getchar())!='\a')
{if((c>='a'&&c<='v')||(c>='A'&&c<='V'))
c=c+4;
if(c>='W'&&c<='Z'||c>='w'&&c<='z')
c=c-22;
cout<<c;
}
cout<<endl;
return 0;
}
为什么输入stuv显示的是abcd,我明明定义是的a<='v',书上的代码是:
if{((c>='a'&&c<='z')||(c>='A'&&c<='Z'))
{c=c+4;
if(c>'Z'&&(c<='Z'+4)||c>'z')
//为什么是这样定义?我输入的字符根本没有大于Z,也没大于z.
c=c-26;}
//c-26又是为什么?如果输入个z,要输出d应该是c=c-22,为什么是c-26?
请帮我解译下好吗?谢谢,有分.
if{((c>='a'&&c<='z')||(c>='A'&&c<='Z'))
{c=c+4;
if(c>'Z'&&(c<='Z'+4)||c>'z')
c=c-26;}
是什么意思?看不明白,可以解释下吗?

你的问题的错误在于前一句改动了c值以后后一句第二次把它改了。应该用if - else if语句:
if((c>='a'&&c<='v')||(c>='A'&&c<='V'))
c=c+4;
else if(c>='W'&&c<='Z'||c>='w'&&c<='z')
c=c-22;

你书上的代码考虑到了前面的修改,不过做了一件蠢事,使代码变得很难懂。

其实这个问题建议利用取余数的运算,于是4可以改成任意一个数,通用性强一些。
即把循环体内写成:
if (isupper(c)) /* 处理大写字母 */
c = 'A' + (c - 'A' + 4)%26;
else if (islower(c)) /* 处理小写字母 */
c = 'a' + (c - 'a' + 4)%26;
// ...