#include <stdio.h> main() { int x=2,y= -1,z=5; if(x<y) if(y<0) z=0; else z=z+1; printf("%d\n", z); }
运行结果为:
6
5
else先匹配最近的if也是说,if(y<0)else这两个是一块的,但是前面的 if(x<y)条件都不成立就进入不了下面的条件里面去 那个程序相当于这样写 if(x<y){ if(y<0) z=0; else z=z+1; }
5,else先匹配最近的if,所以输出还是5
怎酿 回复 : else先匹配最近的if,if(y<0)为真,z=0; printf 不应该是0吗
回复 怎酿: else先匹配最近的if也是说,if(y<0)else这两个是一块的,但是前面的 if(x<y)条件都不成立就进入不了下面的条件里面去 那个程序相当于这样写 if(x<y){ if(y<0) z=0; else z=z+1; }
在这段代码中,`else`与离它最近的未匹配的`if`进行匹配。 在原始代码中,由于`x = 2`不小于`y = -1`,所以第一个`if(x < y)`条件不成立。此时,编译器会继续寻找与之匹配的`else`,但由于没有用大括号明确划分语句块,编译器会认为这个`else`是与第二个`if(y < 0)`匹配的。因此,程序不会执行`z = z + 1`这条语句,而是直接跳过这个`else`部分,保持`z`的值不变,输出 5。
而如果加上大括号来明确语句块的范围,就可以确保`else`与第一个`if`匹配,从而在第一个`if`条件不成立时执行`z = z + 1`,得到预期的输出结果 6。
怎酿 回复 候风起: 第二个`if(y < 0)`匹配 y<0 为真,不应该是继续执行 z=0吗?然后打印 z z=0?
z=5
2
0
5 if与最近的else匹配
用户登录可进行刷题及查看答案
登录后提交答案