<高质量C>C语言基础与变量

来源:互联网 发布:c a星算法 编辑:程序博客网 时间:2024/05/07 08:32

       尽管用C语言做过不少项目,但至今连main函数都搞不明白,真是罪过.   

       void mian()?int main()?int main(int argc,char *argv[],...)?

       mian函数的作用是标定程序运行的开始与结束,结束时由return返回一个值代表离开main,同时销毁过程,以及销毁自动存储生命期的对象。以上3中形式都是可以的,这得根据编译器而定。但是标准的连接规范和调用约定是第三种,也就是说任何编译器都会支持第三中方式。其中 argc代表参数传递的个数,argv[]是参数传递后转化为ASCLL的字符串。

      连接规范,又是一个陌生词汇。这是用来规范语言在内部的名称,若是编译器采用不同的连接规范可能会导致内部名称不一致而连接失败。 例如C标准连接规范中main 的内部名称是_main。通用的连接规范就是C连接规范 extern "C".

例如 extern "C" void add(); 需要注意的是,声明和定义都要extern "C".

      void指针,在C语言中NULL默认为((void*) 0),常用于函数参数,来传递一个函数,并且这个函数与调用者之间已经约定好类型。

      内存自然对齐,例如32位系统中(指精简指令集计算机如ARM-CORTEX),int和指针地址的变量要求应该能被4整除,short变量地址应该是偶数。具体存放顺序与大小段模式有关。小端格式:低地址放低字节,高地址放高字节。大端相反。

      类型转换分为显式和隐式。大小相同的类型转换没问题,但是不同时就会涉及到内存访问扩张和截断引发错误。

      布尔量的判断用           if(flag)   if(!flag)

      整型与零值判断用       if(0==value)   if(0!=value)

      浮点与零值判断用       if(abs(x-y)<=EPSILON) //x==y         if(abs(x-y)>EPSILON)//x!=y 

                                        因为浮点型与存储的精度有关,所以简单的x==y,可能不能达到效果。

                                       如x=1.1234562   y=x=1.1234561   如果精度在10-6的话就可以理解为相等。

     下面又有一个有意思的比较, 在c语言中 
    

  for(i=0;i<1000;i++)
       for(j=0;j<100;j++)
            {
                a[i][j]=1;

            }           执行的速度快,还是
 for(j=0;j<100;j++)
       for(i=0;i<1000;i++)
            {
              a[i][j]=1;

            }   快?  

     答案是第一种快,尽管第二种跨越嵌套的次数少,但是在C语言标准中,数组的索引是按照地址索引的,如果按列行索引,出现跨越内存页的次数就会越多,cache命中率相对也低(这个不太懂,是内外存速度匹配有误?)。最终导致效率降低。

     goto,一般情况杜绝使用,但是在3重以上的for循环要退出时,用一下还是挺好的。

0 0
原创粉丝点击