if-else语句的基本表达式如下:
if (表达式)//如果表达式结果为真,执行语句1,否则执行语句2
{
语句1;
}
else
{
语句2;
}
表达式中存在多种变量类型,如果能在编程时注意到类型的风格,便能在阅读代码时很快的辨识出其类型。常见的存在于表达式中的变量类型有:bool、整形、指针、浮点。当它们在与零进行比较的时候,区别将会显现。
- 其中bool、整形、指针不注重编程格式,很容易将他们混淆。
布尔类型的语义规定:0为假,非0为真。
假设 flag 为真:
if (flag)//良好代码风格
if (!flag)//良好代码风格
if (flag == 1)//不良代码风格
if (!flag == 0)//不良代码风格
- 当整形变量与零值比较时直接将整形变量用“==”或“!=”与0比较。
int num = 10;
if (num == 0)
if (num != 0)
- 指针变量与零值进行比较时,用“==”或“!=”与NULL比较。
NULL用于指针和对象,仅仅代表空值,指向一个不被使用的地址,在大多数系统中,都将0作为不被使用的地址,所以就有了这样的定义。NULL的值在这样的情况下与0相同,但两者的意义相差甚远。
if (p ==NULL)//良好的代码风格,让人清楚p为指针变量
if (p != NULL)
if (p !=0)//让人误解其为整形变量
if (p)//让人误解其为布尔变量
- 浮点变量与零值进行比较时,由于其精度限制,应避免浮点变量用“==”或“!=”与数字进行比较,而是转化成“(>= -EXP) && (<=EXP)”的形式,这里EXP为定义的某一精度。
#define EXP 0.0000001
float a = 0.0
if (a == 0.0)//错误写法
if ((a>=-EXP)&&(a<=EXP))//良好书写风格
这里有一个编程题,用以上的方法可以很好避免隐含的错误。
求一元二次方程的解
首先对求解的过程进行分析:
通过分析可以看出,求解的过程运用了分支语句,所以我们可以使用if-else语句很好的实现:
#define EXP 0.0000001
#include <stdio.h>
#include <math.h>
int main()
{
float a = 0.0;
float b = 0.0;
float c = 0.0;
float disc = 0.0;
scanf("%f%f%f",&a,&b,&c);
if ((a>=-EXP) && (a<=EXP))
{
printf("不是一元二次方程");
}
else
{
disc = b*b-4*a*c;
if ((disc>=-EXP) && (disc<=EXP))
{
printf("有一个根\n");
printf("%f\n",(-b/(2*a)));
}
else if(disc>0)
{
printf("有两个实根\n");
printf("两个根分别为:%f %f\n"
,(-b+sqrt(disc))/(2*a)
,(-b-sqrt(disc))/(2*a));
}
else
{
printf("没有实根\n");
}
}
return 0;
}
- 除了上面应该注意的几点外,当if后的判别式中出现这样的写法:
if (p == NULL)
if (num == 10)
应该尽量写成这样的格式:
if (NULL == P)
if (10 == num)
这是因为在编写的时候,很容易将“==”写成“=”,这样便会出现if (p = NULL)、if (num = 10),这样的编写错误编译器仍然认为其合法,这样在编译过程中编译器并不会报错,待到程序运行结果出来后发现结果有误,这时再进行查错,将会十分繁琐。