最近把曹化工的C语言书又翻了一遍,发现还是有一些不清楚。
1。序列点。这个东西我在原来学习C的时候几乎没有看到它的存在。其实它非常有用。对于a++这样的表
达式,a什么时候更新到新的值,就是在序列点之后。&&,||,?:,逗号,完整表达式。这些是序列点。
&&,||,?:这三个很容易被忽视!
下面的代码就会输出a。h-d++这时候d=0,1-0=1,到后面的d的时候就,d=1,所以输出a
d = 0 ;
h = 1 ;
if ( h - d ++ && d )
{
printf( " a " );
}
else
{
printf( " b " );
}
2。循环语句和switch语句交叉编写。这种方法我是在网上看到的,第一次看到了,非常惊讶,感叹C语言
之强大,程序之奥妙。下面这个网友写的memcpy的优化版就是一个典型例子。(虽然这个并没有起到优化
内存拷贝,我觉得。编译器的内存拷贝一般都在汇编层进行了优化,没有必要自己优化,除非是针对某一
特定型号的cpu)
{
char * d = ( char * )dest;
const char * s = ( const char * )src;
int n = (count + 7 ) / 8 ; // count > 0 assumed
switch ( count & 7 )
{
case 0 : do { * d ++ = * s ++ ;
case 7 : * d ++ = * s ++ ;
case 6 : * d ++ = * s ++ ;
case 5 : * d ++ = * s ++ ;
case 4 : * d ++ = * s ++ ;
case 3 : * d ++ = * s ++ ;
case 2 : * d ++ = * s ++ ;
case 1 : * d ++ = * s ++ ;
} while ( -- n > 0 );
}
return dest;
}
int n = (count + 7) / 8;计算要复制的轮数(每轮复制8位),剩下的余数位数也要复制进去。
count & 7控制要复制余数位数,while (--n > 0)控制轮数。
比如count = 9,则n = 2,count & 7 = 1,要复制2轮,程序跳到case1执行,复制一位之后,再循环一轮,复制8位
3。变量作用域。外部变量和静态变量都是在程序执行之前分配存储,在程序结束之后回收存储空间。外
部变量支持默认初试化,内部变量(自动变量,局部变量)没有默认初始化。所以自动静态变量必须显示
初始化。寄存器变量不能取地址操作。寄存器变量先尝试在寄存器中分配,失败则同自动变量一样。
4。char astr[] = "string"与char* pstr = "string"的区别。astr是数组,astr本身是地址常量,不可
改变,astr++就会报错。pstr为指针变量。
5。复杂指针说明,这个东西一不小心就会弄错的。
char *(*(*var)())[10] :var是一个指针,var是指向函数的指针,var是指向指针函数的指针(函数返回值为指针),返回值是指向具有10个元素的数组的指针,每个元素又是指针。~~~昏了~~