现在的位置: 首页 > 综合 > 正文

C专家编程(一)

2013年07月31日 ⁄ 综合 ⁄ 共 1322字 ⁄ 字号 评论关闭
第一章 C:创越时空的迷雾

1、根据编译器设计思路发展的语言特性:
1)数组下标从0开始,基于偏移量。
2)表达式中数组名可看作是指针,作为函数参数,数组隐式转换为指针,不需要复制数组内容。

2、C预编译
1)字符串替换:foo=bar
2)头文件包含:.h
3)通用代码模板扩展:宏的实际参数只是原样输出,注意空格!最好只用于命名常量,注意大写!

3、复合赋值符
如:b+=3; 
对重复出现的操作数只写一次
早期的b=+3;容易产生混淆

4、可移植的代码
1)只使用已确定的特性
2)不突破编译器的实现限制条件
3)不依赖编译器定义的输出

5、函数原型的目的
编译时,对函数调用的实参和函数声明中的形参进行一致性检查。
最好不要省略形参名。

6、赋值操作的约束条件(满足下列条件之一)
1)左右操作数都是指向有限定符或无限定符的相容类型的指针
2)左边的指针指向的类型,必须具有右边指针指向类型的全部限定符
例子:char * cp;   //指向一个char类型的指针
         const char *cpp;   //指向一个具有const限定符的char类型的指针(不能修改其值)
         cpp=cp;
这样的赋值是正确的。
1)操作数指向的都是char类型,所以是相容的
2)左操作数具有右操作数所指向类型的全部限定符(本例子没有),再加上自身的限定符const
如果反过来赋值就是错的,因为cp指向对象的值是可以修改的,而cpp指向的对象的值是不可修改的。如果合法的话,那么cpp意味着可以修改。
例子:const char**类型是“指向一个有const限定符的char类型的指针的指针”
         char**类型是“指向一个char类型的指针的指针”
二者都是没有限定符的指针类型,但是他们所指向的类型不一样,前者指向char*,而后者指向const char*,所以不相容。

7、const
const限定符只是表示这个符号是只读的,不能被赋值,必须初始化。
可以用来限定函数的形参,这样函数将不会修改实参指针所指的数据。
例子:const int *i=1;
          int j=2;
          i=&j;     //i=2正确
不能使用指针修改这个整型值,比如*i=2,是错误的。但是可以改变指针本身的值,使它指向不同的地址
const与define的区别:
1)const只是给出了对应的内存地址,程序运行时只有一份拷贝,而define有多份拷贝

8、类型转换
数据类型朝着浮点精度更高、长度更长、无符号的方向转换
例子:int a[]={1,2,3,4,,5};
          define NUM (sizeof(a)/sizeof(a[0]))   //采用a[0]的原因是不必改变define,如果类型有变化时
          int d=-1;
          if(d<=NUM-2)           
if条件不会为真,因为sizeof返回类型是unsigned int,比较时d被提升为unsigned int,-1变为一个非常大的正整数。
可以强制类型转换:if(d<=(int)NUM-2)
注意:
1)尽量不要使用无符号类型,而应该使用int,这样不会出现像-1被转换成非常大的正数
2)只有在使用位段和二进制掩码时,使用无符号数。采用强制类型转换的形式。



抱歉!评论已关闭.