C语言拾遗

 1. 操作符与基本类型

赋值运算符的优先级低于算数运算符。如:X*=3+2即X*=(3+2)

 优先级&&高于||, &高于^高于|

 一元操作符的关联是从右到左,“++”和“- -”都必须邦定一个变量或者叫“左值”,如“x”。注意“-X”并不是左值。

例如:z+=-x++ + ++y,相当于:z+=-(x++)+(++y)

 字符:’0’对应ASCII的48,’A’对应的是65。

 无论是无符号还是有符号的整数,-2这样的都将被解释为一个由0和1构成的字符串。对于无符号的负数变量,运算时将被解释为一个大的正整数。

 赋值表达式的值是“=”右边的值,类型是“=”左边的类型。

 7位数字是float浮点数的精度极限(intel8086和motorola68000平台)

 数据类型不同的两个数进行运算,结果将保持数据类型高的类型。

 

2.控制流与编程风格
continu语句将强行开始下一次循环

 字符常数’\n’(其中“n”是三个八进制数字)代表着一个与八进制数字n相对应的字符。比如说,“\101”对应的是001000001即65即在ASCII对应’A’

 所谓优良的编程风格,关键是让你编写出来的程序适合他人阅读:

1). 把你的思路用一些简明的语句表现出来

2). 为那些语句选择一种适当的代码结构

 
如果对某个函数的调用发生在对它做出声明之前,C语言将假设该函数的返回类型是int


 声明为static的变量,在程序加载到内存时被初始化,在程序退出执行时终止

 

3.指针和数组
“type *p”形式的定义向编译器表明:当 *p出现在一个表达式里的时候,它将代表一个type类型的值。P是一个type类型的指针,这个指针的值是某个type类型元素的地址。type称做指针p的基类型。“*”表示要取出p指向的那个地址的值!

 对一个指针变量使用递增操作符,将使指针指向它基类型的下一个元素。实际上是使该指针递增sizeof(basetype)个字节。

 在C语言里,x[i]被定义为“*(x+i)”,其中x是一个地址。i是一个整数递增量。

 关于多维数组:
如,int a[3][3]={

{1,2,3},

{4,5,6},

{7,8,9}

};
则a的类型是指向三元int数组的指针,a的基类型是三元int数组,而a+1将指向内存中的下一个三元int数组。a[0]的类型是指向int整数的指针,a[0]的基类型是int,而a[0]+1将指向内存中的下一个int整数。这里的a,a[0]求值为同一个地址。事实上a+i与*(a+i)所表示的地址也是一样的,都是第i行的地址(但意义不同)。

 

4.结构
//声明结构,用OO的观念来看,就是声明了一个轻量级的‘类’!

struct S1{

char *s;

int I;

struct S1 *s1p;

} ;

 //创建一个结构实例,类似OO里面自定义类型的实例化。

static struct S1 a[]={

{“abcd”,1,a+1},

{“efgh“,2,a+2},

{“ijkl”,3,a}

} ;

struct S1 *p =a;

则p->s表示指针p所指向的那个结构的s字段所指向的字符串。

a[--(p->s1p->i)].s 表示先对指针p所指向的那个结构的s1p字段所指向的那个结构的i字段进行递减,再使用i字段的值作为下标,去访问数组a的相应元素。

 

5.预处理
预处理的几条原则:

1). 只要一条宏定义语句里面包含操作符,就应该用括号把它括起来

2). 宏定义越紧凑越好;表达式比语句好;单语句比多语句好

3). 在宏定义里面要注意避免使用有副作用的C语言元素或者表达式

4). 一定要让对宏进行扩展得到的表达式,语句,块都是完整的C语言元素

5). 宏要尽量简单,如果无法得到一个简单的宏就应该把它定义为函数

posted on 2007-09-05 01:19  J.D Huang  阅读(349)  评论(0编辑  收藏  举报