• [C程序设计语言]第一部分


     

     
    数组... 1
    extern. 3
    “定义”与“声明”... 3
    变量命名规则... 3
    数据类型... 3
    算术类型提升与转换规则... 5
    void. 5
    00xhh. 5
    ANSI C中所有转义字符... 6
    . 6
     

    数组


    局部数组定义时如果未指定长度,又未指定数组内容,则编译报错。但全局的好像可以在定义时不指定长度的情况下也不指定数组内容,但编译时会有警告,内存全清零,并可以对它进行某个元素的读写,但如果下标索引过大可能引起内存读写错误。
     
    在定义数组时可以不指定数组长度,而只指定数组内容。也可既指定长度,又指定数组内容。
     
    C语言中的定义的多维数组是定长的,不像Java那样可以在定义时不指定多维数组长度,而指定不同长度的维度内容,如果C中如此定义,则列的长度为某个维度中最长的长度。
     
    如果在C语言要定义多维不定长的数组,则只能通过指针的形式来指定多维数组,即数组里的非第一维采用指针形式定义,如字符串指针数组。
     
    C语言中的字符串可以使用一个最末元素为’’的空字符来定义。也可将一个字符串直接赋值给一个数组。
     
    定义多维数组时,除了第一维不需要指定大小外,其他维都需要指定数组大小。
     
    Java在声明一个数组时,不能指定数组大小,这与C不同,在new时可以省略后面的维度大小,不能省略前面而指定后面大小: int  b[][][]= newint[1][][];也可以这样:int a[][][] = { { { 1 }, { 2, 3 } } };C语言只允许以后面这样形式定义: int a[][1][1] ={{{1}}};只允许省略第一维大小(在有初始化的情况下,如果定义时未马上初始化,则第一维也不能省略),也可都不省略,但最好别省略,且初始化时定义时大小与初始化的大小一致,否则容易出问题。
     
    如果初始化值的个数少于数组元素的个数,剩余的元素被自动初始化为0(多维数组也是这样),例如,可以用下面的语句将数组n的元素初始化为0int a[10]={0};。但千万要记住:数组的元素不会被自动初始化为0——程序员至少要把第一个数组元素初始为0才能使剩下的元素自动初始化为0
     
    C语言不检查数组是否越界
     
    如下的数组声明会导致语法错误,因为数组元素只有5个而初始化值却有6个:int a[5] = { 1, 2, 3, 4, 5, 6 };,初始化值列表中的初始化值个数多于数组元素的个数是一种语法错误。
     
    如果在声明带有初始化值列表的数组时省略数组的大小(如果没有初始化列表则不能省略),那么数组元素的个数就是初始化列表中的元素个数,例如:int a[] = { 1, 2, 3, 4, 5, 6 };,建立一个有6个元素的数组。
     
    声明为static的数组是在编译时一次性初始化的,如果程序员没有明确地初始化静态数组,那么编译器把它初始化为0
     
    数组实际上就是数组的第一个元素的地址:
    int main(int argc, char * argv[]) {
        char array[5];
        printf("%p ", array);//0022FF4B
        printf("%p ",&array[0]);//0022FF4B
        return 0;
    }
    转换说明符%p通常用来以十六进制格式输出地址。
     
    数组通过引用进行参数传递会提高性能。如果用传值的方式传递数组就会传递每一个元素的值拷贝。对于频繁传递的大型数组来说,对数组进行拷贝会消耗一定时间与内存。
     
    数组作为参数声明时,可以不必定义数组的大小,如果即使包括了,编译器会把它忽略掉对多维数组来说,第一个下标也是不必要的,但是要给出其后所有的下标,编译器用这些下标确定这些元素在内存中的位置。
     
    C语言也会忽略函数原型(使用前的声明)中的变量名。切记:函数原型只是告诉编译器出现在函数中的参数的个数和参数的类型。
     
    多维数组也可这样定义:int array[2][3] = { 1, 2, 3, 4, 5 };这样像一维那样,它会按照顺序先初始化第一行,再初始化第二行,这里最后一个元素 array[1][2] 未被初始化,所以为0
     
    在将多维数组做为函数的参数时,第一个下标也是不必要的(如果写了编译器也会忽略掉),但是要给出其后其他所有的下标,因为编译器要用这些下标确定这些元素在内存中的位置,不管数组的下标有多少个,所有的元素都是在内存中连续存放的,所以编译要根据第一个下标后面所其他下标来定位元素(定位时需要跳过多少个元素)void printArray(int a[][3])
     
    多维数组的数组名为第一维中第一个元素(可能又是一个多维数组)的地址。

    extern


    如果程序包含在多个源文件中,而某个外部(全局)变量在file1文件中定义、在file2file3文件中使用,那么在文件file2file3中就需要使用extern声明来建立该变量与其定义之间的联系。

    “定义”与“声明”


    “定义”表示创建变量或分配存储空间,而“声明”指的是说明变量的性质,但不分配存储单元。
    下面即是声明:int lower,upper,step;
     
    声明用于说明每个标识符的含义,而并不需要为每个标识符预留存储空间,预留存储空间的声明称为定义。

    变量命名规则


    Java一样 A$0
    标准规定,标识符前至少31个字符有效,在某些实现中,有效字符可能会更多。

    数据类型


    char
    int
    float
    double
    short (int)
    long (int)
    float
    double
    long double
     
    int通常代表特定机器中整数的自然长度。short类型通过为16位,long类型通常为32位,int类型可能是1632。各编译器可以根据硬件特殊自主选择合适的类型长度,但要遵循下列限制:shortint类型至少为16位,而long类型至少为32位,并且short类型不得长于int类型,而int类型不得长于long类型
     
    类型限定符signedunsigned可以限定char类型或任何整型。
     
    有关这些类型长度定义的符号常量以及其他与机器和编译有关的属性可以在标准头文件<limits.h><float.h>中找到。
     
    c++bool类型,标准C没有布尔类型,用整型代替布尔类型,非0表示真,0表示假
     
    整型常量若以字母uU为后缀,则表示它是一个无符号数;若以字母1L为后缀,则表示它是一个长整型数;若以字母UL为后级,则表示它是一个无符号长整型数
     
    整型常量的类型同它的形式、值和后辍有关。如果它没有后缀且是十进制表示,则其类型很可能是intlong intunsigned long int如果它没有后缀且是八进制或+六进制表示,则其类型很可能是intunsigned intlong intunsigned long int如果它的后缓为uU,则其类型很可能是unsigned intungigned long int果它的后缓为lL,则其类型很可能是unsigned intungigned long int
     
    C中的整型常量默认都是int类型的常量,但如果一个整数太大以至于无法用int类型表示时,也将被当作long类型处理。
     
    无符号常量以字母uU结尾。后缀ulUL表示是 unsigned long类型,通常用在八进制或十进制常量后面来标示最高位到底是符号位还是数字位,而用在十进制后也是一样
     
    没有后缀的浮点数常量为double类型,后缀fF表示float类型,而后缀lL则是表示long double类型
     
    八进制使用0开头,十六进制使用0X开头。
     
    0XFF=255       char
    0XFFFF=65535   short
    0XFFFFFFFF=-1  int
    如果十六进制常量位数不达到整型int所占位数时,常量首位被看作数字位,而非符号位,如果超过int,则按long来处理
     
    unsigned short a=0xFFFF ,则a=65535,但如果去掉unsigned修饰符后,a=-1,这也从另一方面验证了“整型常量默认都是int类型的常量
        unsignedshort a1 = 0xFFFF;
        short a2 = 0xFFFF;
        printf("%d ", a1);//65535
        printf("%d ", a2);//-1
        printf("%d ", 0xFFFF);//65535
     
        unsignedshort a3 = -1;
        short a4 = -1;            
        printf("%d ", a3);//65535
        printf("%d ", a4);//-1
        printf("%d ", -1u);//-1
     
    C中可以将大的数据类型赋给小的数据类型(比如将long赋值给short类型的变量),不像Java那样需要强转:否则非法。
     
     
    当把较长的整数转换为较短的整数或char类型时,超出的高位部分将被丢弃。如将一个float类型赋值给一个int类型变量时,小数部分将被截取掉;但当把double类型赋值给float类型时,是进行四舍五入还是截取这取决于具体实现。
     

    算术类型提升与转换规则


    首先,如果任何一个操作数为 long double 类型,则另一个操作数转换为 long double 类型。
    否则,如果任何一个操作数为 double 类型,则将另一个操作数转换为 double 类型。
    否则,如果任何一个操作数为 float 类型,则将另一个操作数转换为 float 类型。
    否则,如果任何一个操作数为 unsigned long int 类型,则将另一个操作数转换为 unsigned long int类型。
    否则,如果一个操作数为 long int 类型且另一个操作数为 unsigned int 类型,则结果依赖于long int类型是否可以表示所有的unsigned int类型的值。如果可以,则将unsigned int类型的操作数转换为long int;否则将两个操作数都转换为usigned long int
    否则,如果一个操作数为long int类型,则将另一个操作数转换为long int类型。
    否则,如果任何一个操作数为unsigned int类型,则将另一个操作数转换为unsigned int类型。
    否则,将两个操作数都转换成int类型。
     
    注,表达式中float类型的操作数不会自动转换成double类型(在没有double类型操作数的情况下,与int类型不同)
     
    假定int类型占有16位,long类型占32位,那么,-1L>1UL,这是因为-1L将被提升为unsigned long类型,因而成为一个比较大正数。

    void


    void对象的(不存在的)值不能够以任何方式使用,也不能被显式或隐式地转换为任一非空类型。因为空(void)表达式表示一个不存在的值,这样的表达式只可以用在不需要值的地方
    可以通过强制类型转换将表达式转换为void类型。

    00xhh


    00最大字符可表示为 377,第一位不能大于3(在有三位的情况下),因为一旦大于,则表示的总位数会大于8位。注,也可只使用28进制位来表示,则此时第一位就可以使用大于3的数表示了,另外也可只有一位,比如空字符
    378此时表示两个字符 37 8
    xhh一样,最多两位,也可以只有一位十六进制。

    ANSI C中所有转义字符


    a   响铃
       回退
    f    换页
       换行
        回车
        横向制表
    v   纵向制表
    \
    \?


    00
    xhh


    字符常量 ‘’ 表示值为0的字符,也就是空字符(null),但我们通常用 ‘’ 的形式代替 0 ,以强调某些表达式的字符属性,但其数字值为0
     

  • 相关阅读:
    LuoguP2765 魔术球问题
    LuoguP1402 酒店之王
    luoguP4313 文理分科
    玲珑杯 1138
    codeforces 822 D. My pretty girl Noora(dp+素数筛)
    codeforces 822 C. Hacker, pack your bags!(思维+dp)
    51nod 1376 最长递增子序列的数量(不是dp哦,线段树 +  思维)
    hdu4565 So Easy!(矩阵快速幂)
    atcode E
    atcoder D
  • 原文地址:https://www.cnblogs.com/jiangzhengjun/p/4255830.html
Copyright © 2020-2023  润新知