我试图了解如何进行下一次计算。
例如,如果这是我的终端命令
gcc ex2.c -D b+=2
为什么我要5?
#include <stdio.h>
int main()
{
#ifdef b
printf("%d\n", 2 b | ~ 2 b);
#endif
return 0;
}
2 b表示2 * b吗?
〜2 b表示2 * b,然后〜?
答案 0 :(得分:7)
这很奇怪,它在解析命令行参数时看起来像gcc
和clang
中的错误(或功能)。
类似gcc
的宏声明中的第一个=
符号用空格代替。所以参数:
-D b+=2
等于
#define b+ 2
因为gcc
具有这样的扩展名,所以它等于
#define b + 2
使预处理器输出:
printf("%d\n", 2 + 2 | ~ 2 + 2);
表达式2 + 2 | ~ 2 + 2
等于(2 + 2) | ((~ 2) + 2)
(请参阅operator precedence),表达式在twos complement系统上等于4 | (-3 + 2)
,它等于{{1} }。在二进制补码中,4 | -1
等于-1
,所以0xff....ff
等于4 | -1
的{{1}}(因为它是二进制OR)。
答案 1 :(得分:4)
使用RestTemplate restTemplate = new RestTemplate( new SimpleClientHttpRequestFactory(){
@Override
protected void prepareConnection( HttpURLConnection connection, String httpMethod ) {
connection.setInstanceFollowRedirects(false);
}
} );
ResponseEntity<Object> response = restTemplate.exchange( "url", HttpMethod.GET, null, Object.class );
int statusCode = response.getStatusCodeValue();
String location = response.getHeaders().getLocation() == null ? "" : response.getHeaders().getLocation().toString();
进行编译将 b 定义为gcc ex2.c -D b+=2
,因此源代码
+2
就像
#include <stdio.h>
int main()
{
#ifdef b
printf("%d\n", 2 b | ~ 2 b);
#endif
return 0;
}
为我打印#include <stdio.h>
int main()
{
printf("%d\n", 2 + 2 | ~ 2 + 2);
return 0;
}
要查看预处理后的结果,请使用-E选项:
-1