10.6 条件语句的选用

前面讲解选择结构时已经接触了条件语句,读者对如何使用条件语句应该有了一定的认识。好的条件语句对我们查错也是很有帮助的,正如讲解在if语句中使用“==”时提到的,为了避免因疏忽导致难以查找的错误,我们要养成把常量写在左边,变量写在右边的习惯。这样,即使不小心少写了一个“=”,也会在编译时给出提示信息。如果把变量写在右边,当出现类似错误时,编译时不会给出任何的提示信息,会将其视为一个赋值语句,再将赋值后的值作为条件表达式的值。

如果在while循环语句中犯类似的错误,那么可能导致死循环,如:


include<stdio.h>

define N 3

int main(void)

{

int n,sum;

n=0;

sum=0;

while(n!=N)

{

n++;

sum+=n;

}

printf("1~%d的整数之和为:%d\n",N,sum);

return 0;

}


运行结果:


1~3的整数之和为:6


分析上面的代码,其功能很清楚,如果在写while循环的时候不小心少写了其中的“!”号,那么while循环中的条件表达式就变为一条赋值语句“n=N”,如果给出的N非0,那么while循环就会变为死循环,在编译的时候也不会给出任何的错误或警告提示信息。如果按照上面的讲解,将N常量写在左边,这时如果少写了“!”号,那么编译的时候就会给出如下错误提示信息:


error C2106:'=':left operand must be l-value


这样就能够轻松地实现对错误的定位。

在条件语句中有一种特殊的短路逻辑表达式,对于这种短路逻辑表达式,如果条件语句中前面的条件已经满足整个表达式的要求,那么就不再执行后面的语句。例如下面的代码:


include<stdio.h>

int main(void)

{

int i,a;

i=1;

a=7;

if(a>9||i++)

printf("i=%d\n",i);

a=10;

if(a>9||i++)

printf("i=%d\n",i);

return 0;

}


运行结果:


i=2

i=2


分析上面的运行结果,第一次将a赋值为7,这时在条件语句“a>9||i++”中,仅根据前面的a>9还不能判断这个表达式的值是否为真,所以还要继续执行接下来的i++。由于给定i的初始值为1,因此整个表达式的值为true,执行打印语句。接下来将a赋值为10,这时在条件语句中仅根据前面的a>9即可判断整个条件语句的值为真,所以后面的i++被“短路”了,没有被执行,接下来打印输出的i值还是2。在上面的条件语句中采用的是或运算,接下来看与的情况。


include<stdio.h>

int fun(char*str)

{

printf("%s\n",str);

return 0;

}

int main(void)

{

int a;

a=7;

if(a>9&&fun("a=7"));

a=10;

if(a>9&&fun("a=10"));

return 0;

}


运行结果:


a=10


分析上面的代码,定义了一个函数fun,该函数的返回值作为条件表达式的一部分,在将a赋值为7的时候,a>9的值为false,所以整个表达式的值为false,条件语句中的后续语句不再被执行,这个时候并没有调用fun函数,但是接下来将a赋值为10,这时a>9为true,会继续执行接下来的条件语句,函数fun得到调用,从而打印输出此时的信息。

在使用条件语句的时候还要注意的一点是,对于float或double类型的变量,不要使用!=或者==等比较符,而应该使用>=、>、<等比较符,因为浮点运算存在精度问题,所以不能按照理论值来对其进行处理,应该根据计算机实际的处理方法来选用比较运算符。