标签:c
问题是钟哥几天前在automation的群里面抛出来的。
code:
#include <stdio.h> int main(int argc,char* argv[]) { int a = 7; int b = 1; printf("before process,a = %d,b = %d\n",a,b); b = +~ +~ +~ +~ + ~~a; printf("after process,a = %d,b = %d\n",a,b); return 0; }
如果能过,ab最后的值是多少?
当然,我给出了解释的时候就会变得“这又什么意思咯,原来如此。。。”
既然到了把问题记录到blog的份上,代码肯定能过编译的,不然故事就没法继续编了。。。哈哈
一般的+用法都是 varible1+varible2; 是所作为双目operator。这里居然和+~混着用。一眼看去,貌似很乱,居然还能过编译
这里没有很“权威的说法”,C标准并没管这事,得出的结论是测试性的
+被用作单目操作符,表示数的正负。
也就是说+a 表示不改变a原来的符号,如果是个负数就是负数,是个正数就是正数。
如果是-a就是取a的相反数
b = +~ +~ +~ +~ + ~~a;
这里的~也就是普通的取反,这里+几乎不起作用,因为不改变a的值,~取反(bit inverse )6次,于是这里相当于b = a;
最后ab的值也分别是7 7
liuzjian@ubuntu:~/Desktop$ ./a.out
before process,a = 7,b = 1
after process,a = 7,b = 7
我们对代码稍作修改,继续对问题进行探讨
把+部分改成-,其他的不变,一步步的分析operator对a值的操作
#include <stdio.h> int main(int argc,char* argv[]) { int a = 7; int b = 1; printf("before process,a = %d,b = %d\n",a,b); b = -~ -~ -~ +~ + ~~a; printf("after process,a = %d,b = %d\n",a,b); return 0; }
It was done!
liuzjian@ubuntu:~/Desktop$ ./a.out
before process,a = 7,b = 1
after process,a = 7,b = -5
Ok,看起来还比较有意思+~-
标签:c
原文地址:http://blog.csdn.net/cinmyheart/article/details/28899083