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类型的变量,不要使用!=或者==等比较符,而应该使用>=、>、<等比较符,因为浮点运算存在精度问题,所以不能按照理论值来对其进行处理,应该根据计算机实际的处理方法来选用比较运算符。