C++ 这个表达式是如何工作的?(c^0,c^32); get(s); 对于(;s[i];){ f&=(s[i++]
正如第一条评论中提到的,C++ 这个表达式是如何工作的?(c^0,c^32); get(s); 对于(;s[i];){ f&=(s[i++],c++,C++,正如第一条评论中提到的,^实际上是XOR操作符,而不是幂。除此之外,操作符的顺序也会受到影响,如您在此处所见: gets(s); for(;s[i];){ f&=(s[i++]<'a'); } for(i=0;s[i];){ putchar(s[i++]^f*32); } 这对某些值意味着什么,比如说s[i++]=7和f=9 二进制,情况就是这样: s[i++]^f*32 // a piece of your code =(s[i++]^f)*32 // d
^
实际上是XOR
操作符,而不是幂。除此之外,操作符的顺序也会受到影响,如您在此处所见:
gets(s);
for(;s[i];){
f&=(s[i++]<'a');
}
for(i=0;s[i];){
putchar(s[i++]^f*32);
}
这对某些值意味着什么,比如说s[i++]=7
和f=9
二进制,情况就是这样:
s[i++]^f*32 // a piece of your code
=(s[i++]^f)*32 // due to the order of operators, this is the same thing.
结果是7*64=252
就大写和小写而言,可能有兴趣知道,在ASCII中,它们之间有一个简单的关系,让我们向您展示这个示例:
s[i++] = 0111
f = 1001
s[i++]^f = 1110
s[i++]^f*32 = 111000000
我相信这就是您想要的(但我不理解f
变量背后的逻辑)
编辑
根据评论:
您的代码错误,应该是以下代码:
"A" = 65 = 1000001
"a" = 97 = 1100001
"A" XOR 32 = "a"
"a" XOR 32 = "A"
在
f
为1的情况下,它在小写和大写之间切换s[i++]
。在f
为0的情况下,它什么也不做。如第一条注释中所述,^
确实是异或
操作符,而不是幂。除此之外,操作符的顺序也会受到影响,如您在这里所见:
gets(s);
for(;s[i];){
f&=(s[i++]<'a');
}
for(i=0;s[i];){
putchar(s[i++]^f*32);
}
这对某些值意味着什么,比如说s[i++]=7
和f=9
二进制,情况就是这样:
s[i++]^f*32 // a piece of your code
=(s[i++]^f)*32 // due to the order of operators, this is the same thing.
结果是7*64=252
就大写和小写而言,可能有兴趣知道,在ASCII中,它们之间有一个简单的关系,让我们向您展示这个示例:
s[i++] = 0111
f = 1001
s[i++]^f = 1110
s[i++]^f*32 = 111000000
我相信这就是您想要的(但我不理解f
变量背后的逻辑)
编辑
根据评论:
您的代码错误,应该是以下代码:
"A" = 65 = 1000001
"a" = 97 = 1100001
"A" XOR 32 = "a"
"a" XOR 32 = "A"
如果
f
为1,则在小写和大写之间切换s[i++]
。如果f
为0,则它不起任何作用。这就是它背后的魔力
如果仔细查看,您会注意到同一字母的大写和小写的ASCII码与值32不同
因此,例如A
的ASCII码是65
,而A
的ASCII码是97
和
97-65=32
这意味着,如果您将任何大写字母(来自ASCII)和+32加在一起,您将得到同一字母的小写字母。并且-32再次表示大写字母。
'A'+32=0100 0001+0010 0000=0110 0001='A'
另一件有趣的事情是,你实际上可以反转字符的第6位,而不是上/下大小写的+-32
32=0010 0000
(请注意,32第六位的值为1)
我们可以在那里使用XOR(^
)操作来进行反转。所以,
'A'^32='A'
和'A'^32='A'
s[i++]^(f*32)
现在让我们回到问题的代码。从代码的第二部分开始:
A : 65 = 0100 0001
XOR
32 = 0010 0000
|
v
a : 97 = 0110 0001
for(i=0;s[i];){
putchar(s[i++]^f*32);
}
它所做的只是迭代字符串s
,并根据f
的值进行反转^32*f
。
因此,如果f
是1
它将进行反转,如果0
则不是(as32*f=0
)。而
f
的值基于代码的另一部分:
A : 65 = 0100 0001
XOR
32 = 0010 0000
|
v
a : 97 = 0110 0001
for(i=0;s[i];){
putchar(s[i++]^f*32);
}
(;s[i];)的{
f&=(s[i++]这就是它背后的魔力
如果仔细查看,您会注意到同一字母的大写和小写的ASCII码与值32不同
因此,例如A
的ASCII码是65
,而A
的ASCII码是97
和
97-65=32
这意味着,如果您将任何大写字母(来自ASCII)和+32加在一起,您将得到同一字母的小写字母。并且-32再次表示大写字母。
'A'+32=0100 0001+0010 0000=0110 0001='A'
另一件有趣的事情是,你实际上可以反转字符的第6位,而不是上/下大小写的+-32
32=0010 0000
(请注意,32第六位的值为1)
我们可以在那里使用XOR(^
)操作来进行反转。
所以,'A'^32='A'
和'A'^32='A'
s[i++]^(f*32)
现在让我们回到问题的代码。
从代码的第二部分开始:
A : 65 = 0100 0001
XOR
32 = 0010 0000
|
v
a : 97 = 0110 0001
for(i=0;s[i];){
putchar(s[i++]^f*32);
}
它所做的只是迭代字符串s
,并根据f
的值进行反转^32*f
。
因此,如果f
是1
它将进行反转,如果0
则不是(as32*f=0
)。
而f
的值基于代码的另一部分:
A : 65 = 0100 0001
XOR
32 = 0010 0000
|
v
a : 97 = 0110 0001
for(i=0;s[i];){
putchar(s[i++]^f*32);
}
(;s[i];)的{
F&=(S[i++] <代码> ^ < /Code >不是幂运算符而是XOR运算符。请参见。<代码> > <代码>完全从新的C和C++标准中删除。不确定为什么代码以这样不可读的方式编写。我建议清除所有这些,从头开始重写逻辑。正如Martin Fowler所说:“任何傻瓜都能写出计算机能理解的代码。好的程序员能写出人类能理解的代码。”是一组可以用于文本的解决方案。代码的初始值是什么?<代码> >代码> i>代码>我更新了我的答案,我相信代码中有一个bug。<代码> ^ < /> >不是幂运算器,而是XOR运算符。请参见。<代码>获取< /C> >完全从新C和C++删除。标准不知道为什么代码是以如此不可读的方式编写的。我建议清除所有这些并从头重写逻辑。正如Martin Fowler所说:“任何傻瓜都可以编写计算机可以理解的代码。优秀的程序员编写人类可以理解的代码”。这是一系列解决方案,可以用于文本的大写。