if语句
if根据条件选择执行语句(两路,二选一,类似二叉树),else不能独立存在并且和前面离它最近的if匹配。
注意:if语句中零值比较要小心。
bool类型
bool类型的变量应该直接出现在条件中(作为flag或者开关),不要再和其它变量进行比较。C语言本身是没有bool类型的,由编译器厂商自行规定设计,造成相同的代码在不同的编译器环境下得到的结果不一致。C语言只规定了非0为真(-1也为真)。
bool b=TRUE;
if(b)
{
//statement 1
}
Iif(!b)
{
//statement 2
}
普通整型变量和0(常量)比较时,0(常量)应该出现在比较符号左边,因为C语言中的等于符号==和我们平时生活中=容易混淆出错,可以巧妙利用编译器左值不能为常量来避免出错。
if(0==1)
{
//statement 1
}
else
{
//statement 2
}
float类型和0值的比较
float类型的变量不能直接和0值比较,需要定义精度来约束(数学上的夹逼原理),只能大约相等。
计算机采用离散的值来模拟表示数据,有精度限制,并不能完全正确地表示浮点型变量(毕竟数学上浮点数是无穷无尽的,而计算机不可能表示出来)。
#define EPSINON 0.00000001
float f=0.0;
if((EPSINON<=f)&&(f>=EPSINON))
{
//statement 1
}
else
{
//statement 2
}
switch语句
switch语句对应单个条件多个分值的情形
switch的限制性:
Case语句中的值只能是整型或者字符型
每个case分支语句必须要有break,否则会导致分支重合
Default语句有必要加上,以处理特殊情况
Case语句排序原则:
按字母或者数字的顺序排列(方便调试和二次开发);
正常的情况放在前面,异常的放在后面;default语句只用于处理真正的默认情况。
小结:
if语句实用于按“范围”进行判断的情形;
switch适合对各个离散值分别进行判断的情形。
循环语句:
do语句先执行后判断,循环体至少执行一次;
while语句先判断后执行,循环体可能不执行;
for语句先判断后执行,比while更简洁。
int fun(int n)
{
int ret=0;
while(n&&(ret +=n--)); //n为负数死循环n>0
}
int fun2(int n)
{
int ret=0;
int i=0;
for(i=1;i<=n;i++)
{
ret+=1;
}
return ret;
}
int fun3(int n)
{
int ret=0;
if(n>0)
{
do{
ret+=n--;
}while(n);
}
return ret;
}
break语句
break终止循环,continue终止本次循环。
那switch能否用continue?
C语言在设计break和contiue时,break被设计用来跳出一个代码块,而continue是结束本次循环,必须用在循环中,所以switch不能用continue。
一般函数设计思路:
在函数中分配资源,判读是否进行,是执行函数语句(否释放资源退出函数),释放资源退出函数。
int fun(int n)
{
int i=0;
int ret=0;
int * p=(int*)malloc(sizeof(int)*n);
do
{
if(NULL==p) break;
if(n<0) break;
for(i=0;i<n;i++)
{
p[i]=i;
printf(“%d\n”,p[i]);
}
ret=1;
}while(0);
free(p);
retuen ret;
}//巧用DoWhile统一函数(单入口单出口)的结构为申请资源,执行功能,释放资源,让函数结构更清晰,防止内存泄漏。