Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.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 -D name=定义和位运算符_C_Gcc_Bitwise Operators_Bitflags - Fatal编程技术网

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条目误用此。我发现,这正是您所假设的。但是我没有找到这种行为的测试用例。也没有提到在这个问题中被误用的特性。