zoukankan      html  css  js  c++  java
  • C语言细节笔记1

    /*******************************************************************************
        ——笔记
        1. 函数申明的书写。
            可以省略参数名称,只保留参数类型,但最好不要省略形参名称,他们常可以
            向程序员传递一些有用的信息。
            char * strcpy(char * dst, char * src);
        
        2.  const 易于被混淆的部分说明
        const int limit = 10;
        limit = 7;               // [Error] assignment of read-only variable 'limit'
        关键字 const 并不是将一个变量转换成一个常量,而是在一个变量前加一个限制
        符,表示这个变量的值不能被修改。即 const 并不表示一个常量,可用 switch 
        语句验证,例如:
        const int two = 2;
        int i;
        switch (i)
        {
            case 1:
            case two:  // integral constant expression expect
            default:
                ;
        }  // 这是在书上说的,我使用Dev验证时没有报错。。。。。。。 
             
        int limit = 10;
        const int * limitp = & limit;
        int i = 27;
        limitp = &i;
        *limitp = 1;   // [Error] assignment of read-only location '* limitp'
        这段代码中 limitp 表示一个指向常量类型的指针,这个指针不能用于修改这个整
        型的值,但指针本身的值可以改变 
        
        3. 使用无符号类型的建议
        尽量不要使用无符号类型,以免增加不必要的复杂性。
        只有在使用位段和二进制掩码时,才可以使用无符号数,应该在表达式中使用强制
        类型转换,使操作数均为有符号数或无符号数,这样就不必由编译器来选择结果的
        类型。 
        
        4. 字符串处理函数 strlen 求解结果不会包括一个用于存放 '' 的额外空间。
        malloc(strlen(str)); 是错误的
        malloc(strlen(str) + 1); 才是对的  
        
        5. C语言运算次序的问题
        由于运算符的优先级与结和性的判断问题,最好按照程序员所需要运算步骤,牢
        记 *  优先级高于 + - ,涉及其他运算符时一律加上括号()。 
        
        6. 变量的声明与类型的声明分开,便于增加代码的可读性
        struct veg
        {
            int hah;
            double heh;
            char ch;
        };
        struct veg onion, pear;
         
        7. 操作typedef
        不要为了方便起见对结构体使用typedef,这样做的唯一好处是使你不必写struct关
        健字,但这个关健字会向你提供一些提示信息,你不应该省略它。
        typedef应该被用在: 
            数组,结构,指针以及函数的组合类型。
            或者在可移植类型中,这样当把这段代码移植到不同平台时,要选择正确的类型时,
            只需要在typedef中修改,无需对每个声明都加以修改。 
            typedef也可以为后面的强制类型转换提供一个简单的名字。 
        
        8. == 与 = 在判断语句中的使用 
        防止 == 与 = 因笔误导致的错误,在使用 == 号时,将常量放在左边,如果不小心
        将 == 写生 = ,编译器会提示常量无法被赋值。 
         
        9. 使用define时宏名使用大写 
        
        10. int char 等关健字所修改的是它们右边紧邻的项目,而 const 和 volatile 类型
        修饰符所修改的是它们左边紧邻的项目。 
        
        11. 使用 ?: 来表示简单的 if else 语句,这样可以简化代码,并且保持引用的局
        部性。但是千万不要在一个条件操作符内嵌套另一个条件操作符。如果这样做,可能会
        发现要想明白代码的确切意思变得十分困难。 
        
        12. 数组的声明就是数组,指针的声明就是指针,两者不能混淆。但在使用数组在表达
        式中时,数组总是可以写成指针的形式,两者可以互换。
        如:extren char a[]; 不能改成指针的形式。 
        数组和指针在编译器处理时是不同的,在运行时的表示形式也不一样,并可能产生不同
        的代码。对编译器来言,一个数组就是一个地址,一个指针就是一个地址的地址。应该
        根据实际情况作出选择。 
        在表达式中,它们是可以互换的,因为它们在编译器里的最终形式都是指针,并且都可
        以进行取下标操作。 
        在下列情况下,对数组的引用不能使用指向该数组的第一个元素的指针代替
        (1)数组作为sizeof()的操作数,显然此时需要的是整个数组的大小,而不是指向
         第一个元素的指针的大小。
         int arry[5];
         int cnt = sizeof(arry);   // 20
           printf("cnt = %d
    ", cnt);
          int * p = arry;
         int j = sizeof(p);        // 8
         printf("j = %d
    ", j); 
         
        (2)使用取地址操作符取数组的地址。
        (3)数组是一个字符串常量初始值。
        
        13. 数组名是一个不可修改的左值。 
        
        14. 数组的初始化
        元素类型为int型 如果数组的长度比提供的初始值个数要大,剩余的元素会被初始化为0
        float 为 0.0 指针类型为 NULL 
        
        int arr1[5] = {1, 2};
        float arr2[5] = {1.0, 2.0};
        int i;
        for (i = 0; i < 5; ++i)
        {
            printf("%-3d", arr1[i]);
        }
        printf("
    ");
        for (i = 0; i < 5; ++i)
        {
            printf("%f  ", arr2[i]);
        }
        printf("
    ");
        int * arr3[5] = {&arr1[0], &arr1[1]};
        if (NULL == arr3[2]) 
            printf("NULL !
    ");   
        
        输出结果:
            1  2  0  0  0
            1.000000  2.000000  0.000000  0.000000  0.000000
            NULL !
        
        15. 将字符串拷贝到字符数组时,定义的数组长度需要时strlen(string) + 1
        字符串结尾为''.
        
         
    ********************************************************************************/  
  • 相关阅读:
    SPOJ913 Query on a tree II
    SPOJ375 Query on a tree
    HDU4348 To the moon
    Bzoj2753 [SCOI2012]滑雪与时间胶囊
    HDU4612 Warm up
    Uva11374 Airport Express
    Uva1624 Knots
    DevExpress的GridControl的使用以及怎样添加列和绑定数据源
    C#中使用Path、Directory、Split、Substring实现对文件路径和文件名的常用操作实例
    ZedGraph的曲线的LineItem对象的Tag属性存储信息进而在鼠标悬浮时进行显示
  • 原文地址:https://www.cnblogs.com/lnlin/p/6838163.html
Copyright © 2011-2022 走看看