zoukankan      html  css  js  c++  java
  • 悬挂else引发的问题

    这个问题虽然已经为人熟知,而且也并非C语言所独有,但即使是有多年经验的C程序员也常常在此失误过。
    考虑下面的程序片段:
    if (x == 0)
    	if (y == 0)
    		error();
    else{
    	z = x + y;
    	f(&z);
    }

    这段代码中编程者的本意是应该有两种主要情况:x等于0以及x不等于0。对于x等于0的情形,除非y也等于0(此时调用函数error),否则程序不作任何处理;对于x不等于0的情形,程序首先将x与y之和赋值给z,然后以z的地址为参数来调用函数f。


    然而,这段代码实际上所做的却与编程者的意图相去甚远。
    原因在于C语言中有这样的规则,else始终与同一对括号内最近的未匹配的if结合。如果我们按照上面这段程序实际上被执行的逻辑来调整代码缩进,大致是这个样子:
    if (x == 0) {
    	if (y == 0) 
    		error();
    	else {
    		z = x + y;
    		f(&z);
    	}
    }

    也就是说,如果x不等于0,程序将不会做任何处理。如果要得到原来的例子中由代码缩进体现的编程者本意的结果,应该这样写:
    if (x == 0) {
    	if (y == 0) 
    		error();
    } else {
    	z = x + y;
    	f(&z);
    }

    现在,else与第一个if结合,即使它离第二个if更近也是如此,因为此时第二个if已经被括号“封装”起来了。
    #include <stdio.h>
    
    
    int main()
    {
    	int x,y;
    	x = 0;
    	y = 1;
    	if(x == 0)
    	{
    		if(y == 0)
    			printf("x == 0 && y ==0
    ");
    	}
    	else {
    	 	printf("x!=0
    ");
    	}
    	return 0;
    }


    摘自《C陷阱与缺陷》

  • 相关阅读:
    jdk动态代理底层实现
    spring-FactoryBean
    大型网站技术架构 核心原理与案例分析 pdf
    实战JAVA虚拟机 JVM故障诊断与性能优化 pdf
    《实战Java高并发程序设计》pdf
    mysql-注意点
    Json入门
    inflate, findViewById与setContentView的区别与联系
    提高编程能力的7条建议
    JDBC之一:JDBC快速入门
  • 原文地址:https://www.cnblogs.com/youngerchina/p/5624469.html
Copyright © 2011-2022 走看看