关键字的秘密
专题一:关键字的秘密。包括以下章节:
- 基本数据类型分析
- auto,register,static分析
- if,switch,do,while,for分析
- goto,void,extern,sizeof分析
- const,volatile分析
- struct,union分析
- enum,typedef分析
if语句注意事项
- bool型变量应该直接出现在条件中,不要进行比较
#include <stdio.h>
typedef enum bool
{
FALSE = 0,
TRUE = -1
}BOOL;
int main()
{
BOOL b;
int i = -1;
//在c语言中没有标准的bool类型
//在c语言中只有0和非0,所以TRUE不一定必须为1
if(b==-1)
{
printf("TRUE\n");
}
else
{
printf("FALSE\n");
}
return 0;
}
- 普通变量与0值相比较,0值应该出现在比较符号的左边
#include <stdio.h>
int main()
{
int i = 0;
if(i=-1)//本应该是i==-1,打印结果为FALSE;但是写成了i=-1,结果却是TURE;写成-1=i时,在编译阶段就会报错。
{
printf("TRUE\n");
}
else
{
printf("FALSE\n");
}
return 0;
}
- float类型的变量不能直接与0进行比较,需要定义精度
#include <stdio.h>
#define E 0.00000001 //精度到小数点后8位,可以设置其他的精度
int main()
{
float f = 5.0;
//计算机中精度是有限度的,超过一定范围后,会出现不准确
if((5.0-E <= f)&&(f <= 5.0+E))//不是5.0==f
{
printf("TRUE\n");
}
else
{
printf("FALSE\n");
}
return 0;
}
switch语句分析
- case语句中的值是能是整型或字符型
- case语句排列
- 按数字或字母排列个语句
- 正常情况放前面,异常情况放后面
- default只用于处理正在的默认情况
实例分析3-1:if和switch使用分析
#include <stdio.h>
void f1(int i)
{
if( i < 6 )
{
printf("Failed!\n");
}
else if( (6 <= i) && (i <= 8) )
{
printf("Good!\n");
}
else
{
printf("Perfect!\n");
}
}
void f2(char i)
{
switch(i)
{
case 'c':
printf("Compile\n");
break;
case 'd':
printf("Debug\n");
break;
case 'o':
printf("Object\n");
break;
case 'r':
printf("Run\n");
break;
default:
printf("Unknown\n");
break;
}
}
int main()
{
f1(5);
f1(9);
f2('o');
f2('d');
f2('e');
return 0;
}
小结
- if语句适用于按“片段”进行判断的条件中
- switch语句适用于需要对各个离散值进行分别判断的条件中
- if语句可以从功能上完全替代switch语句,switch无法替代if语句
- switch对于多分支条件判断的情形更加简洁
do,while,for区别
- do语句先执行后判断,至少执行一次
- while语句先判断后执行,有可能一次也不执行
- for语句先判断后执行,比while更简洁
实例分析3-2:循环语句使用对比(自然数累加)
#include <stdio.h>
int f1(int n)
{
int ret = 0;
int i = 0;
for(i=1; i<=n; i++)
{
ret += i;
}
return ret;
}
int f2(int n)
{
int ret = 0;
//n为负数时,会成死循环
//while( n && (ret += n--) );
while( (n > 0) && (ret += n--) );
return ret;
}
int f3(int n)
{
int ret = 0;
//n为负数时,会首先执行一次
// do{
// ret += n--;
// }while( n > 0 );
if( n > 0 )
{
do
{
ret += n--;
}while( n );
}
return ret;
}
int main()
{
//for循环进行累加计算最简洁明了
//while和do..while比较复杂
printf("%d\n", f1(10));
printf("%d\n", f2(10));
printf("%d\n", f3(10));
return 0;
}
实例分析3-3:do和break妙用
#include <stdio.h>
#include <malloc.h>
int func(int n)
{
int i = 0;
int ret = 0;
int* p = (int*)malloc(sizeof(int) * n);
//使用do..break好处:
//1,一个入口,一个出口
//2,里面的所有判断都可以break跳出,不需要每个free()
//3,避免内存泄漏
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);
return ret;
}
int main()
{
if( func(10) )
{
printf("OK");
}
else
{
printf("ERROR");
}
return 0;
}