#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()的行数 |