一* if条件语句的用法:if语句起执行判断和分支的作用
if(条件表达式)//情况一
{
执行语句1;//花括号内放多条语句,满足条件就执行所有的语句。没有花括号只执行一条语句。
执行语句2;
}
if(条件表达式)//情况二
{
执行语句1;
执行语句2;
}
else//不满足条件表达式的其他条件
{
执行语句1;//花括号内放多条语句,满足条件就执行所有的语句。没有花括号只执行一条语句。
执行语句2;
}
if(条件表达式1)//情况三
{
执行语句1;
执行语句2;
}
else if(条件表达式2)//满足条件2
{
执行语句1;//花括号内放多条语句,满足条件就执行所有的语句。没有花括号只执行一条语句。
执行语句2;
}
else//不满足条件1,2表达式的其他条件
{
执行语句1;
执行语句2;
}
if()//情况四:嵌套
{
if()
{
}
else
{
}
}
else if()
{
}
else
{
}
总结:
1. C中0表示假,非0表示真。
2. if语句执行,先执行完成表达式的值,得到逻辑结果,在进行判定
二*关于if条件表达式:
1.bool变量和0的比较:(ture和false)bool一般很少用
首先,C语言有没有bool类型? c99之前,主要是c90是没有的,目前大部分书,都是认为没有的。因为书,一般都要落后于行业。 但是c99引入了_Bool类型(你没有看错,_Bool就是一个类型,不过在新增头文件stdbool.h中,被重新用宏写成了 bool,为了保证C/C++兼容性)。
2.float 变量与"零值"进行比较:
a.浮点数在内存中存储,并不想我们想的,是完整存储的,在十进制转化成为二进制,是有可能有精度损失的。(注意: 这里的损失,不是一味的减少了,还有可能增多。浮点数本身存储的时候,在计算不尽的时候,会“四舍五入”或者其他策略)。
结论:因为精度损失问题,两个浮点数,绝对不能使用==进行相等比较.
那么两个浮点数该如何比较呢?
一》用自定义精度:
//写法一 #include#define Epsilon 0.00000001 int main() { if( x>(-Epsilon) && x #include //fabs()函数的包含文件 #define Epsilon 0.00000001 int main() { if( fabs(x) < (Epsilon) )//绝对值 { } return 0; }
二》用系统精度:
//double最小精度:DBL_EPSILON //float最小精度: FLT_EPSILON //写法一 #include#include //使用DBL_EPSILON要包含的头文件 int main() { if( x>(-DBL_EPSILON) && x #include //fabs()函数要包含的头文件 #include //使用DBL_EPSILON要包含的头文件 int main() { if( fabs(x) < DBL_EPSILON ) { } return 0; }
三* if与else的匹配问题和一些注意事项:
1.if与else匹配:
#includeint main() { if() if() 执行语句; else 执行语句; //没有花括号,else和最近的if匹配 return 0; }
无花括号时,就近原则匹配。良好的代码风格尽量把花括号用上。
#includeint main() { if() { if() { 执行语句; } } else { 执行语句; //一眼可以看出,有花括号时,else和第一个if匹配 } return 0; }
2.常见的注意事项:
a.if语句后面跟分号(;)
此时if()语句条件成立,相当于执行了空语句,所以紧跟if后面的语句不管条件成立与否都会执行,此时相当于if失去了分支能力。
b.条件表达式内的==和=混淆了
此时若是本来应该用关系操作符==,而用成了赋值操作符=,相当于本来的表达式的判断,变成了赋值,若是赋值为0,则为一直表示假(即条件不成立,不执行if紧接的{}内的语句,直接跳过);若是赋值为非0,则为一直表示真(即条件成立,执行if紧接的{}内的语句)。所以很可能造成了我们需要执行分支功能时,直接跳过;不需要执行时,却执行。



