#include <stdio.h>
#define _ F-->00||-F-OO--;
int F=00,OO=00;
void F_OO()
{
_-_-_-_
_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_-_-_-_-_
_-_-_-_-_-_-_-_
_-_-_-_
}
main()
{
F_OO();
printf("F: %d OO: %d\n",F,OO);
}
问这段程序输出是什么?
这代码主要就是运算符优先级的问题
我们先看宏定义的_ 是什么值
F-->00就是判断F是否大于0,然后F--
如果F-->00结果为真,那么后半部分-F-OO--是不执行的,OO值不变
如果F-->00结果为假,那么后半部分-F-OO--结果是0,然后OO=-1
F_OO()函数里面
第一行_-_-_-_
被替换成
F-->00||-F-OO--;-F-->00||-F-OO--;-F-->00||-F-OO--;-F-->00||-F-OO--;
也就是
F-->00||-F-OO--;
-F-->00||-F-OO--;
-F-->00||-F-OO--;
-F-->00||-F-OO--;
执行 F-->00||-F-OO--; 结果为0,然后F=-1, OO=-1
执行 -F-->00||-F-OO--; 结果为1,然后F=-2, OO=-1
F_OO()是void类型,所以里面的运算结果不用管了,只要管全局的F和OO就可以了
可以看出执行一次F-->00||-F-OO--; F减1,OO减1
执行一次-F-->00||-F-OO--; F减1,OO不变
因此该代码运行结果就是F的值是负的_ 的个数,OO的值是负的F_OO()的行数
|