Chinaunix首页 | 论坛 | 博客
  • 博客访问: 315781
  • 博文数量: 64
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 1972
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-31 21:53
个人简介

文明之精神,野蛮之体魄。

文章分类
文章存档

2015年(4)

2013年(60)

我的朋友

分类: C/C++

2013-09-05 11:12:14

一、分支语句if分析
1.if语句用于根据条件选择执行语句
2.else不能独立存在,且总是与它最近的if相匹配。
注意:if语句中零值的比较
-------bool型变量应该直接出现于条件中,不要进行比较。因为在C语言中非0为真,0为假。
-------普通变量和0值比较时,0值应该出现在比较符号的左边。这样可以避免出错。例如,(i = 0)写成(0 = i)时就有效避免了错误。
-------float型变量不能直接进行0值比较,需要定义精度。便于代码移植。
Example:
#define EPSINON 0.0000001
float f = 0.0;
if((-EPSINON <= f) && (f <= EPSINON)){
    //statement 1
}else{
    //statement 2
}
二、分支语句switch分析
1.switch语句对应单个条件多个分值的情形。
2.每个case语句分支必须要有break,否则导致分支重叠。
3.default语句有必要加上,处理特殊情况。
4.case语句中的值只能是整型或字符型。case语句排列顺序分析:
-------按字母或数字顺序排列各条语句。
-------正常情况放前,异常情况靠后
-------
default语句只用于处理真正的默认情况。
三、if和switch比较
1.if语句实用于需要“按片”进行判断的情形中。(范围判断)
2.switch语句实用于需要对各个离散值进行分别判断的情形中。
3.if语句可以安全从功能上代替switch语句,但switch语句无法替代if语句
4.switch语句优点:对于多分支判断的情形更加简洁。
三、循环语句分析
1.基本工作方式
-------通过条件表达式判定是否执行循环体,条件表达式遵循if语句表达式的原则
2.do,while,for的区别
-------do语句先执行后判断,循环体至少执行一次
-------while语句先判断后执行,循环体可能不执行
-------
for语句先判断后执行,相比while更简洁
Example:
  1 #include
  2
  3 int f1(int n)
  4 {
  5     int ret = 0;
  6     int i = 0;
  7     for(i = 1; i <= n; i++)
  8     {
  9         ret += i;
 10     }
 11     return ret;
 12 }
 13
 14 int f2(int n)
 15 {
 16     int ret = 0;
 17     while(n > 0 && (ret += n--)){};
 18     return ret;
 19 }
 20 int f3(int n)
 21 {
 22     int ret = 0;
 23
 24     if(n > 0)//必须判断,否则会进入死循环
 25     {
 26         do{
 27             ret += n--;
 28         }while(n);
 29     }
 30     return ret;
 31 }
32 int main()
 33 {
 34     printf("%d\n",f1(10));
 35     printf("%d\n",f2(10));
 36     printf("%d\n",f3(10));
 37 }
四、一般函数设计思想
1.在函数中分配资源
2.执行函数语句
 2.1判断是否执行
3.释放资源并退出函数
五、问题:do语句有存在的必要吗?为什么存在?在什么情况下最适合。
Example:
  1 #include
  2
  3 int func(int n)
  4 {
  5     int i = 0;
  6     int ret = 0;
  7     int *p = (int*)malloc(sizeof(int) * n);
  8
  9     do{
 10         if(NULL == p) break;
 11         if(n < 0) break;//使用break跳出块,而不是使用return,使用return可能导致内存泄
 12
 13         for(i = 0; i < n; i++){
 14             p[i] = i;
 15             printf("%d\n",p[i]);
 16         }
 17         ret = 1;
 18     }while(0);
 19
 20     free(p);
 21     return ret;
 22 }

六、void,extern,sizeof分析
1.void的意义
------void修饰的函数返回值和参数:如果函数没有返回值,声明为void。如果函数没有参数,应该声明为void。
2.不存在void变量
------C语言中没有定义void究竟是多大的内存的别名
3.void指针的意义
------C语言规定只有相同类型的指针才可以相互赋值
------void*指针作为左值用于接收任意类型的指针
------void*指针作为右值赋值给其他指针时需要强制类型转换。malloc函数
Example:
 1 #include
  2
  3 void *my_memset(void *p,char v,int size)
  4 {
  5     void *ret = p;
  6     char *dest = (char*)p;
  7     int i = 0;
  8     for(i = 0; i < size; i++){
  9         dest[i] = v;
 10     }
 11     return ret;
 12 }
 13
 14 int main()
 15 {
 16     int a[5] = {1,2,3,4,5};
 17     int i = 0;
 18     my_memset(a,0,sizeof(a));
 19     for(i = 0; i < 5; i++)
 20     {
 21         printf("%3d",a[i]);
 22     }
 23     printf("%\n");
 24     return 0;
 25 }
4.extern中隐藏的意义
1.extern用于声明外部定义的变量和函数。
2.extern用于告诉编译器用标准C方式进行编译,用法:
extern "C"
{
    int f(int a,int b){
        return a + b;
    }
}
5.sizeof神秘面纱
-------sizeof是编译器的内置标识符,不是函数
-------sizeof用于计算相应实体所占的内存大小
-------sizeof的值在编译期就已经确定
阅读(1450) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~