C语言复习

最近把曹化工的C语言书又翻了一遍,发现还是有一些不清楚。
1。序列点。这个东西我在原来学习C的时候几乎没有看到它的存在。其实它非常有用。对于a++这样的表

达式,a什么时候更新到新的值,就是在序列点之后。&&,||,?:,逗号,完整表达式。这些是序列点。

&&,||,?:这三个很容易被忽视!

下面的代码就会输出a。h-d++这时候d=0,1-0=1,到后面的d的时候就,d=1,所以输出a

   int  d,h;

  d
=   0 ;
  h
= 1 ;
  
if  ( h - d ++   &&  d )
  {
      printf(
" a " );
  }
  
else
  {
      printf(
" b " );
  }


2。循环语句和switch语句交叉编写。这种方法我是在网上看到的,第一次看到了,非常惊讶,感叹C语言

之强大,程序之奥妙。下面这个网友写的memcpy的优化版就是一个典型例子。(虽然这个并没有起到优化

内存拷贝,我觉得。编译器的内存拷贝一般都在汇编层进行了优化,没有必要自己优化,除非是针对某一

特定型号的cpu)

void *  mymemcpy(  void *  dest,  const   void *  src, size_t count )
{
    
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  ( -- >   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个元素的数组的指针,每个元素又是指针。~~~昏了~~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值