Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 这个表达式是如何工作的?(c^0,c^32); get(s); 对于(;s[i];){ f&=(s[i++]_C++ - Fatal编程技术网

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
则不是(as
32*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
则不是(as
32*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所说:“任何傻瓜都可以编写计算机可以理解的代码。优秀的程序员编写人类可以理解的代码”。这是一系列解决方案,可以用于文本的大写。