C -D name=定义和位运算符
我试图了解下一次计算是如何进行的 例如,如果这是我的终端命令C -D name=定义和位运算符,c,gcc,bitwise-operators,bitflags,C,Gcc,Bitwise Operators,Bitflags,我试图了解下一次计算是如何进行的 例如,如果这是我的终端命令 gcc ex2.c -D b+=2 为什么我得到5分 #include <stdio.h> int main() { #ifdef b printf("%d\n", 2 b | ~ 2 b); #endif return 0; } #包括 int main() { #ifdef b printf(“%d\n”,2b | ~2b); #恩迪夫 返回0; } 2b是指2b ~2b表示2*b,然后~?使
gcc ex2.c -D b+=2
为什么我得到5分
#include <stdio.h>
int main()
{
#ifdef b
printf("%d\n", 2 b | ~ 2 b);
#endif
return 0;
}
#包括
int main()
{
#ifdef b
printf(“%d\n”,2b | ~2b);
#恩迪夫
返回0;
}
2b是指2b
~2b表示2*b,然后~?使用
gcc ex2.c-db+=2编译。c-db+=2
将b定义为+2
,因此源代码
#include <stdio.h>
int main()
{
#ifdef b
printf("%d\n", 2 b | ~ 2 b);
#endif
return 0;
}
使用
gcc ex2.c-db+=2编译时
将b定义为+2
,因此源代码
#include <stdio.h>
int main()
{
#ifdef b
printf("%d\n", 2 b | ~ 2 b);
#endif
return 0;
}
这很奇怪,因为它可以工作,看起来像是解析命令行参数时来自
gcc
和clang
的bug(或特性)
看起来,gcc
将第一个=
登录宏声明替换为空格。因此,参数:
-D b+=2
等于
#define b+ 2
#define b + 2
因为gcc
有这样一个扩展来解释它,所以它等于
#define b+ 2
#define b + 2
使预处理器输出:
printf("%d\n", 2 + 2 | ~ 2 + 2);
表达式
2+2 | ~2+2
等于(2+2)|((~2)+2)
(请参阅)在系统上等于4 |(-3+2)
,等于4 |-1
。在two-s上,补码-1
等于0xff…ff
,因此4 |-1
等于0xff…ff
(因为它是二进制的或)这是-1
这很奇怪,它的工作原理很奇怪,看起来像是解析命令行参数时gcc
和clang
中的一个bug(或特性)
看起来,gcc
将第一个=
登录宏声明替换为空格。因此,参数:
-D b+=2
等于
#define b+ 2
#define b + 2
因为gcc
有这样一个扩展来解释它,所以它等于
#define b+ 2
#define b + 2
使预处理器输出:
printf("%d\n", 2 + 2 | ~ 2 + 2);
表达式
2+2 | ~2+2
等于(2+2)|((~2)+2)
(请参阅)在系统上等于4 |(-3+2)
,等于4 |-1
。在两个补码中,-1
等于0xff…ff
因此4 |-1
等于0xff…ff
(因为它是二进制或二进制)这是-1
这太奇怪了…不要学着这样编写和执行代码。这是我根据-db+=2
做的一个测试中的一个问题,似乎不是一个有效的语法。我想不管是谁做了这个测试,他都喜欢莎士比亚(“2b | ~2b”是C代表“生存还是毁灭”)。有趣,但在学习环境中也有点烦人,这是非常做作的,在现实世界中,做这种事情的程序员很有可能。。。代码回顾中的单词。这…很奇怪…不要像这样学习编写和执行代码。这是我根据-db+=2
做的测试中的一个问题,似乎不是一个有效的语法。我猜测试的人都喜欢莎士比亚(“2b | ~2b”是C代表“生存,还是毁灭”)。有趣,但在学习环境中也有点烦人,这是非常做作的,在现实世界中,做这种事情的程序员很有可能。。。那么“~”运算符是2还是2+2?@GiladRozmarin它是2,因为运算符的优先级,在这两种情况下,结果都是-1,因为将所有位放到1是由mistake@GiladRozmarin不要忘记选项-E
,了解附加内容非常有用,您可以在注释中添加一些#include,然后再使用它以避免产生大量行,因为“~”运算符位于2或2+2上?@GiladRozmarin它位于2上,因为运算符优先级,在这两种情况下,结果都是-1,因为将所有位放入1是由mistake@GiladRozmarin不要忘记选项-E
了解附加内容很有用,您可以在注释中添加一些内容#在使用它之前不要产生太多行,因此对于b+=3,我将得到5行?不知道,让我们看看:2+3 | ~2+3
=5 |-3+3
=5 | 0
=5
。是的,你会得到幸运的5
。这真的很难看。它也适用于更复杂的表达式,如printf'b\nb\nb(3)| gcc-E--dD-D'b(=x)(x+x)
。我希望没有人将此用于实际编程,我甚至没有看到IOCCC条目误用此。我发现,这正是您所假设的。但是我没有找到这种行为的测试用例。也没有提到在这个问题中被误用的特性。那么对于b+=3,我会得到5?不知道,让我们看看:2+3 | ~2+3
=5 |-3+3
=5 | 0
=5
。是的,你会得到幸运的5
。这真的很难看。它也适用于更复杂的表达式,如printf'b\nb\nb(3)| gcc-E--dD-D'b(=x)(x+x)
。我希望没有人将此用于实际编程,我甚至没有看到IOCCC条目误用此。我发现,这正是您所假设的。但是我没有找到这种行为的测试用例。也没有提到在这个问题中被误用的特性。