当前位置 博文首页 > 不负时光可怜人:【C语言程序设计】C语言知识点汇总1——变量、

    不负时光可怜人:【C语言程序设计】C语言知识点汇总1——变量、

    作者:[db:作者] 时间:2021-06-27 17:34

    1 C语言概述

    这一章无重点内容。

    1.1 ASCII

    第一部分是:ASCII非打印控制字符;
    第二部分是:ASCII打印字符;
    第三部分是:扩展ASCII打印字符

    ASCII表上的数字0–31分配给了控制字符,用于控制像打印机等一些外围设备。例如,12代表换页/新页功能。此命令指示打印机跳到下一页的开头。(参详ASCII码表中0-31)

    记忆:48-0;65-A;97-a;先大写后小写

    ASCII值控制字符ASCII值打印字符ASCII值打印字符ASCII值打印字符
    0NUT32(space)64@96
    1SOH33!65A97a
    2STX34"66B98b
    3ETX35#67C99c
    4EOT36$68D100d
    5ENQ37%69E101e
    6ACK38&70F102f
    7BEL39,71G103g
    8BS40(72H104h
    9HT41)73I105i
    10LF42*74J106j
    11VT43+75K107k
    12FF44,76L108l
    13CR45-77M109m
    14SO46.78N110n
    15SI47/79O111o
    16DLE48080P112p
    17DCI49181Q113q
    18DC250282R114r
    19DC351383S115s
    20DC452484T116t
    21NAK53585U117u
    22SYN54686V118v
    23TB55787W119w
    24CAN56888X120x
    25EM57989Y121y
    26SUB58:90Z122z
    27ESC59;91[123{
    28FS60<92/124|
    29GS61=93]125}
    30RS62>94^126`
    31US63?95_127DEL

    特殊字符解释

    NUL空VT 垂直制表SYN 空转同步
    STX 正文开始CR 回车CAN 作废
    ETX 正文结束SO 移位输出EM 纸尽
    EOY 传输结束SI 移位输入SUB 换置
    ENQ 询问字符DLE 空格ESC 换码
    ACK 承认DC1 设备控制1FS 文字分隔符
    BEL 报警DC2 设备控制2GS 组分隔符
    BS 退一格DC3 设备控制3RS 记录分隔符
    HT 横向列表DC4 设备控制4US 单元分隔符
    LF 换行NAK 否定DEL 删除

    2 数据类型、运算符与表达式

    2.1 标识符

    标识符:用来标识常量、变量、函数等字符序列;

    组成:

    • 只能有字母、数字、下划线组成,且第一个字符必须是字母或下划线
    • 区分大小写

    2.2 关键字

    关键字:C语言中已经被预先定义并使用的标识符,总共有32个(下文罗列关键字带注释为不理解的部分,需要另外花时间

    数据类型关键字:

    • void
    • char
    • float
    • double

    类型修饰符

    • short
    • long
    • sighed
    • unsighed

    复杂类型关键字

    • struct
    • union:共用体声明
    • enum:枚举声明:
      • https://blog.csdn.net/xingjiarong/article/details/47275971
    • typedef:声明类型别名
    • sizeof:得到特定类型或特定类型变量的大小

    存储级别关键字

    • auto:指定为自动变量,由编译器自动分配及释放,通常在栈上分配
    • static:作为静态变量,分配在静态变量区,修饰函数时,指定函数作用域为文件内部
    • register:寄存器变量
    • extern :指定对应变量为外部变量,提示编译器遇到此变量和函数时在其他模块中寻找其定义:
      • https://blog.csdn.net/xingjiarong/article/details/47656339
    • const:与volatile合称“CV特性”,指定变量的值不可被当前线程/进程改变
      • https://blog.csdn.net/xingjiarong/article/details/47282255
    • volatile:指定变量的值有可能会被系统或其他进程/线程改变,强制编译器每次从内存中取得该变量。

    A跳转结构

    • return
    • continue
    • break
    • goto

    B分支结构

    • if
    • else
    • switch
    • case
    • default

    C循环结构

    • do
    • for
    • while

    特殊的标识符:他们没被列入关键字,却也有特定的含义。

    如:define、include、under、if

    new的用法:

    使用new运算符时必须已知数据类型,new运算符会向系统堆区申请足够的存储空间,如果申请成功,就返回该内存块的首地址,如果申请不成功,则返回零值。

    一般使用格式:

    格式1:指针变量名=new 类型标识符;

    格式2:指针变量名=new 类型标识符(初始值);

    格式3:指针变量名=new 类型标识符 [内存单元个数];

    int *a=new int;
    
    int *a = new int(5); 作用同上,但是同时将整数空间赋值为5
    
    int *a=new int [5];
    

    2.3 整型常量

    1. 了解各个进制的表示范围
    2. 0开头八进制,0x开头16进制(八进制不能出现>8)

    2.4 实型常量

    这类题易错重点关注

    表示方式:

    1. 十进制表示形式:

      • .123
      • 123.0
      • 0.0
      • 123.
    2. (*)指数表示形式(e或E之前必须有数字,且指数必须为整数:指数是e后面的哦!)

      • 12.3e3:12.3*10^3
      • 123e2:123*10^2
      • 78e-1:78*10^-1

    2.5 字符型常量与字符串常量

    区别

    • 形式上:单双引号的区别,并且字符串尾后者多一个’\0’,(区分问法是所占空间还是长度)
    • 赋值
    //字符串数组,只能在定义的时候,通过=赋初值,如果先定义,在赋值就不可以
    {
        1. 定义的时候直接用字符串赋值
        char a[10]="hello";
    //注意:不能先定义再给它赋值,如char a[10]; a[10]="hello";这样是错误的。
        
        2. 对数组中字符逐个赋值
        char a[10]={'h','e','l','l','o'};
    //字符串可以赋值给字符指针变量,或者将字符串用字符数组保存。
        
        3. 先定义,后利用strcpy赋值
    	char a[10];
    	strcpy(a, "hello");
    //strcpy是一种C语言的标准库函数,strcpy把含有'\0'结束符的字符串复制到另一个地址空间,返回值的类型为char*。
    //函数实现还是通过数组一个个操作赋值。
    
    }
    //单字符赋值,可通过数组下标方式或指针方式,引用数组元素,进行
    {
        
        char a[10];
    	char ch='a';
    	for(i=0;i<10;i++)
         a[i]=ch+i ; //可通过数组下标引用数组元素,完成赋值
    	char *p;
    	for(p=a; p<a+10; p++)
        *p=ch++; //通过指针对数组相应元素赋值
    }
    

    2.6 (*)不同变量所占空间

    在不同及其中所占空间可能有不同,但大小关系(char1<int2<=short2<=long4<=float4<double8)

    2.7 (*)运算符的优先级

    img

    3.9 位运算符与位运算表达式

    • 逻辑运算符:!优先于&&优先于||
    • 位运算符
      • 按位非(取反)~
      • &
      • |
      • 按位异或:^
      • 左移:右边低位补零
    int a=15,x;
    x=a<<2;//求x
    a:00001111
    a<<2:
    00111100
    
    • 右移:>>
      • 若a是有符号数,则高位补符号位
      • 若a是无符号数,则高位补0
    char a=-4,b=4,x,y;
    x=a>>2;
    y=b>>2;
    a:11111100(负数的补码形式不要忘)
    a>>2:11111111,十进制为-1

    2.10 数据类型转换

    自动转换:将复制运算符的右边数据转换为左边变量的数据类型,然后赋值

    3 格式化输入输出语句

    许多小细节,令人抓狂

    3.1 printf

    1 打印整数

    d格式符:用来输出十进制(decimal)

    • md:输出宽度占m个字符
      • 若小于m,左端补空格,若大于m,则按照实际位数输出
      • -md为左对齐
    • +d:数据带有正负号
    • 0md:如有前导空格,以0补齐(注意是在前面哦)
    • ld:输出长整型数据,同样可以指定宽度
    • *:动态域宽设置
    	int y=-3456;
    	printf("%8d\n",y);//1
    	printf("%+8d\n",y);//2
    	printf("%08d\n",y);
    	printf("y=%-8d",y);
    	printf("y=%-08d\n",y);	
    //output
       -3456
       -3456
    -0003456
    y=-3456   y=-3456
    //在devc++中跑完之后发现,这里添加1,2两句效果相同;期初我认为+是不是不起作用了,将y的数值改为正数可发现1式无+,2式有+
    //最后两句都有4个空格
    
    /*动态域宽设置*/
    int i=1;
    printf("##%*d\n",i,i);
    i++;
    printf("##%*d\n",i,i);
    i++;
    printf("##%*d",i,i);
    //output
    ##1
    ## 2
    ##  3
    /*注意这里的*不是指空格的数量,如其名动态域宽设置,设置的为其域宽,当i等于1时其宽度为1*/
    

    o格式符:以八进制(octal)形式输出整数

    • 在前面添加#号,可以使数字按照八进制(0。。。)的形式输出

    x格式符:以十六进制(hexadecimal)形式输出整数

    • 在前面添加#号,同理

    u格式符:以无符号(unsigned)十进制数输出

    注:以上长整型,同样加’l’

    	//十六进制同理
    	int y=123;
    	printf("y=%8o\n",y);
    	printf("%#8o",y);
    
    short y=-1;
    	printf("unsigned=%u",y);
    //output
    unsigned=4294967295;
    //不难发现,负数在计算机内以补码形式存储,所以输出成无符号位的数字,需要把原先二进制转化为10进制
    
    /*3.42 turb C 标准,16位微机中int=short=2byte */
    	int x,y,z;
    	long m;
    	y=(x=32767,x-1);//逗号运算符从左往右
    	z=m=0xffff;
    //output
    y=32766;
    z=-1;
    m=65535;
    //int两个字节,16——>二进制(11111111),计算机中有符号表示为-1,如果int输出为%u,同样是65535;
    
    2 打印浮点数

    f格式符

    • mf:

    • m.nf

      • 整个输出占m个字符宽度,右对齐(若超出则按原样输出)
      • 小数部分截短至n个字符
      • 可直接用.nf
    • 同样可以在前面添加**+,-,0**

    注意点

    1. 默认小数点后六位
    2. 单精度精确到8位,双精度精确到16位。
    3. float和double都会被转换成double然后送给printf函数 所以其实用%f还是%lf输出其实并不重要,输入时,%lf表示地址对应的是8字节的double,%f表示地址对应的是4字节的float……存储方式都不一样,混用了肯定会出问题
    printf("%f",1.12345678);
    //实际输出为1.123457,因为保留6位有效数字,所以第七位要四舍五入到第六位。
    
    
    printf("%.18f\n",1.12345678901234567890);
    //下方实数末尾的f表示单精度浮点数,只存储7位有效数字
    printf("%.18f\n",1.12345678901234567890f);
    

    g格式符:(自动选择)

    ? 采用g格式符输出数据时

    • 当数据<=10-5或>=107时,按指数方式输出
    • 否则按小数方式输出
     double a=1000000000; 
     double b=123.456; 
     printf("%e\n",a);
     printf("%f\n"