dnf战法二觉插画补丁:请C语言高手详细解释

来源:百度文库 编辑:神马品牌网 时间:2024/04/28 03:20:19
定义:int a=1,b=2,c=3,d=4,m=2,n=2;
当执行表达式:(m=a>b)&&(n=c>d)后,n的值为什么是2
机器执行到这里是不是按运算符的优先级顺序进行计算呢,老师说机器再执行此语句时“&&”运算符后边的算式根本没被执行,那这不是和运算符的优先级相矛盾了吗?

呵呵~楼主的朋友说的都不错。当遇到A&&B时,如果A为FALSE,刚编绎器不会检查B表达示的值。而是直接GOTO出去了!编绎器采取的是这样的“短路”策略.
如果楼主有兴趣的话,可以去看一下《编绎原理》的书。
所有的高级语言,对应的编绎器,都有着一套编绎策略。虽然C语言编绎链接出来的可执行文件跑的最快。但如果要从编绎器角度来讲,Pascal编绎器是最优秀的。

没有矛盾。

编译器为了提高计算效率,在计算 &&、|| 这种逻辑表达式的时候,如果表达式的一侧已经可以确定整体的值,另外一侧就没有必要计算了,比如:

a && b

如果 a 为真,那么需要计算 b 才可以知道总体的真假;但如果 a 为假,无论 b 值如何,整体都为假,这时 b 就不会被计算了,因为多此一举。

a || b

也是类似的,如果 a 为真,那么 b 也不会被计算。

你的例子中:

m = a > b 是为假的,所以无论 n = c > d 的值如何,都是假,所以 n = c > d 就不会被计算了。

老师说得对
因为(m=a>b)已经是 假 了,&&又是“与”运算,只要前边的是假 后边的根本不用执行,最后的结果肯定是假

假如前边是 真 才执行后边的那个条件

1&&1=1
0&&任何数都是零
不知道你明白没有

在做 A && B中,A为非,那么B没有必要判断了!这是C的特点,在别的就不太清楚了,但在VB中,比较在asp中的VBscript,则要所有表达式全判断完了再返回整个表达式的值!
如:
dim ipage
ipage = request.querystring("page")
if ipage="" or not isNumeric(ipage ) or ipage<=0 then
response.write "页码超出范围了!"
end if
从C语言的方面来讲,这是不会出现什么问题的~!
但在asp中就会出错,什么情况出错呢??如当 ipage="abc" 时出错!

楼上错了,正确的解释是这样的。
为了加快运行的速度,编译器对于逻辑表达式的判定是可确定值时就停止运算的。在算完m=a>b之后&&左边的表达式为0,那么无论&&之后的表达式是否为1都无法改变整个表达式为0的事实,所以编译器就将&&后的运算给省略了。也就是n=c>d根本没有被执行。所以n还是等于2

=优先级大于〉和〈号
最小的就是&&
所以先进行赋值运算 n=c所以n的值是2