zoukankan      html  css  js  c++  java
  • C语言学习笔记-变量和数据类型

    C语言学习笔记-变量和数据类型

    CPU、寄存器、内存的关系

    程序运行时指令和数据都会被加载到内存。
     CPU、寄存器、内存的关系
    CPU通过地址总线和数据总线从内存中获取指令和数据,由于CPU的IO性能远远高于内存,为了提高CPU的使用效率,在CPU完成数据的计算之后将结果暂时存储在其内部的寄存器。寄存器是内存与CPU的桥梁。

    如果寄存器是64位,而总线只有32位,那么该CPU是准64位CPU(不是真的64位CPU)
    如果寄存器是64位,而总线也是64位,那么该CPU是、64位CPU

    如果寄存器是32位,而总线只有16位,那么该CPU是准32位CPU(不是真的32位CPU)
    如果寄存器是32位,而总线也是32位,那么该CPU是32位CPU

    CPU、寄存器、内存、硬盘之间的关系

    由于CPU内部的寄存器数量是有限的,那么提升CPU的效率也是有限的,在CPU的内部高速缓存(一级缓存、二级缓存、三级缓存)来提高CPU的效率。
    CPU、寄存器、内存、硬盘之间的关系

    内存的最小存储单位

    内存的最小存储单位

    内存是用来存放数据的,类似于一栋楼,由许多房间组成,每个房间都有一个唯一的地址。
    内存存放数据的最小单位是一位二进制位(bit)。
    生活中的整数大部分都是十进制的,逢十进一,包含0-9之间的数字。
    而二进制是计算机内部存储数据的进制,只能存放0或者1,因为内存在物理层面,我们使用高低电平来记录信息,通常使用高电平表示1,低电平表示0,因此在计算机底层只能认识0,1两种状态。

    字节

    如果是8个二进制位(bit),就表示一个字节(Byte),即1Byte=8bit,也就是一 个字节可以存储八个0或者八个1
    字节是内存计量(统计内存的存储单元总数量)的最小单位。

    常用的计算机存储单位换算

    1Byte=8bit
    1KB=1024B
    1MB=1024KB
    1GB=1024MB
    1TB=1024GB
    1PB=1024TB
    1EB=1024PB
    1ZB=1024EB
    1YB=1024ZB 

    数据类型

    数据类型的本质就是给不同的数据进行分类了来达到合理的利用内存空间,提高存储效率的目的。
    基本数据类型:字符型(char), 短整型(short),整型(int),长整型(long),C99支持长长整型(long long),单精度浮点型(float),双精度浮点型(double),布尔(bool)

    类型(char,short,int,long,long long,float ,double)是抽象的概念,只有大小,没有空间,系统不会给类型分配空间,只给类型定义的变量分配空间。

    测量类型的大小:sizeof(类型名/变量名),当传递变量名时对应的是变量对应类型的大小。

    32位系统 sizeof()关键字测量基本数据类型的大小

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    /*
    	sizeof()关键字测量基本数据类型占据的内存大小
    	@author liuguanglei ittimelinedotnet@gmail.com
    	@wechat 18601767221
    	@website ittimeline.net
    	@version 2020/02/28
    */
    int main(int argc, char* argv[])
    {
    
    	printf("char占据的字节数量是%d
    ",sizeof(char));
    	printf("short占据的字节数量是%d
    ",sizeof(short));
    	printf("int占据的字节数量是%d
    ",sizeof(int));
    	printf("long占据的字节数量是%d
    ",sizeof(long));
    	printf("float占据的字节数量是%d
    ",sizeof(float));
    	printf("double占据的字节数量是%d
    ",sizeof(double));
    	printf("long long占据的字节数量是%d
    ",sizeof(long long));
    	system("pause");
    	return 0;
    }

    32位平台sizeof()
    32位平台sizeof()

    Visual Studio 2019 自带了32位编译器和64位编译器,X86就表示32位
    32位编译器

    如果想要在64位编译,只需要将x86切换到x64即可
    x64编译器

    再次运行程序,对比C语言的基本数据类型在32位和64位系统占据的字节大小
    sizeof()关键字查看数据类型占据的字节大小

    在Windows下,无论是32位还是64位,long类型都是占据4个字节,而如果想要使用八个字节的整数,可以使用long long 类型。
    在Linux下,64位的编译器,long类型占据八个字节。
    linux long long类型

    常量

    在使用基本的数据类型之前,先使用常量和变量,因为基本的数据类型都有常量和变量。
    常量是其值在程序运行期间不能修改,例如 整数10,小数3.14,字符'a'都是常量,常量之所以不能被修改,是因为常量是在文字常量区。
    内存在存储数据时,考虑到数据不同的用途和特点,把内存存储区域分为各种区域:栈区、堆区、代码区、文字常量区、全局区。每个区域的数据类型都有各自的特点。

    在日常开发中常用的常量有字符常量、短整型常量、整型常量、长整型常量、单精度浮点型常量以及双精度浮点型常量。

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    /*
    	C语言中常用的常量
    	@author liuguanglei ittimelinedotnet@gmail.com
    	@wechat 18601767221
    	@website ittimeline.net
    	@version
    */
    int main(int argc, char* argv[])
    {
    	//字符常量
    	printf("char = %c
    ",'a');
    	//短整型常量
    	printf("short = %hd",10);
    	//整型常量
    	printf("int = %d",10);
    	//长整型常量
    	printf("long = %ld",123456789);
    	//单精度浮点型常量
    	printf("float = %f",3.14f);
    	//双精度浮点型常量
    	printf("double = %lf",3.1415926);
    	//常量不能被修改,例如赋值
    	//10=20
    	system("pause");
    	return 0;
    }

    变量

    变量概述

    变量就是程序运行时其值可以被修改,而且在定义变量时系统会根据变量类型给变量开辟内存空间,例如定义一个整数变量 int num,系统会给num开辟4个字节的内存空间,变量可以进行读(取值)写(赋值)操作。

    在学习变量时需要从变量的定义、变量的声明和变量的使用三个方面。

    变量的定义表示让变量存在,系统会给变量开辟内存空间。
    变量的声明:高速编译器该变量已经存在,此处通过编译,不会再开辟内存空间。
    变量的使用:即对变量的读(取值)写(赋值)操作,操作空间。

    变量的定义

    C语言中定义变量使用 类型名 变量名 来定义一个变量,例如 int age,此时编译器会针对age变量开辟四个字节的空间大小。
    变量名age就是某段内存空间的别名,操作变量名就是操作变量名表示的内存空间。

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    /*
    	变量的定义和使用
    	@author liuguanglei ittimelinedotnet@gmail.com
    	@wechat 18601767221
    	@website ittimeline.net
    	@version 2020/02/28
    */
    int main(int argc, char* argv[])
    {
    	//定义变量
    	int age;
    	//给变量赋值
    	age = 28;
    	//打印输出age的值 
    	//这里的%d会使用变量age的值替换
    	//因此输出结果就是age = 28
    	printf(" age = %d 
    ",age);
    	system("pause");
    	return 0;
    }

    变量的命名规范

    变量名在命名时要遵守相关规范:

    • 只能由字母、数字、下划线组成,但是不能以数字开头
    • 不能是C语言的关键字,但是可以包含关键字,例如int,double,float都是C语言的关键字
    • 变量名强制建议见名知意,方便团队协作

    变量的初始化

    变量的初始化是在定义变量时就进行赋值,例如int age =0,这里就是将整数变量age初始化为0。

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    /*
    	变量的初始化
    	@author liuguanglei ittimelinedotnet@gmail.com
    	@wechat 18601767221
    	@website ittimeline.net
    	@version 2020/02/28
    */
    int main(int argc, char* argv[])
    {
    	//变量的初始化:定义时赋值
    	int age = 28;
    
    	//此时不叫定义的初始化,因为定义时没有赋值
    	int data;
    	data = 10;
    
    	system("pause");
    	return 0;
    }

    变量的声明

    变量的声明就是告诉编译器该变量存在,此处通过编译。
    变量的声明分为自动识别和显示声明。

    自动识别就是在使用变量前已经声明并初始化或者声明后赋值。

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    /*
    	变量的初始化
    	@author liuguanglei ittimelinedotnet@gmail.com
    	@wechat 18601767221
    	@website ittimeline.net
    	@version 2020/02/28
    */
    int main(int argc, char* argv[])
    {
    	//变量的初始化:定义时赋值
    	int age = 28;
    
    	//此时不叫定义的初始化,因为定义时没有赋值
    	int data;
    	data = 10;
    
    	system("pause");
    	return 0;
    }

    如果使用变量在定义变量的前面,编译器会提示无法识别的标识符,因为编译器是从上往下编译的。

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    /*
    	变量使用的注意事项
    	@author liuguanglei ittimelinedotnet@gmail.com
    	@wechat 18601767221
    	@website ittimeline.net
    	@version 2020/02/28
    */
    
    
    int variable_usage_main(int argc, char* argv[])
    {
    	//  error C2065: “value”: 未声明的标识符 因为data在使用之前没有声明
    	
    	//在main方法中打印输出value变量的值
       // printf("value = %d 
    ",value);
    
    
    	system("pause");
    	return 0;
    }
    //在main方法外部定义整数变量value
    int value = 100;
    
    

    使用extern显示声明变量

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    /*
    	变量的声明之显示声明
    	@author liuguanglei ittimelinedotnet@gmail.com
    	@wechat 18601767221
    	@website ittimeline.net
    	@version 2020/02/28
    */
    
    //显示声明 告诉编译器该变量存在,此处通过编译 不能赋值,否则程序运行时会报错
    extern int data;
    int main(int argc, char* argv[])
    {
    	printf("data = %d 
    ", data);
    	system("pause");
    	return 0;
    }
    int data = 28;

    变量的使用

    变量在声明之后就可以使用,变量多个使用表示对变量的读写操作,所谓读就是获取变量的值,例如使用C语言提供的printf()函数按照指定的格式符输出变量的值,写就是赋值以及各种变量的运算,C语言中使用"="表示赋值,赋值是将右边的值赋值给左边的变量。

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    /*
    	变量的读写操作
    	@author liuguanglei ittimelinedotnet@gmail.com
    	@wechat 18601767221
    	@website ittimeline.net
    	@version 2020/02/28
    */
    int main(int argc, char* argv[])
    {
    	int num = 10;
    	//变量的读操作-> 输出变量的值 %d由变量num的值替换
    	printf(" num  =%d 
    ",num );
    
    	int data;
    	//变量的写操作 将20赋值给变量data 
    	// = 表示将右边的值20赋值给左边的变量
    	data = 20;
    	printf("data = %d 
    ",data);
    	system("pause");
    	return 0;
    }

    变量的写操作:数据运算

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    /*
    	变量的写操作:数据运算
    	@author liuguanglei ittimelinedotnet@gmail.com
    	@wechat 18601767221
    	@website ittimeline.net
    	@version 2020/02/28
    */
    int main(int argc, char* argv[])
    {
    	int left = 10;
    	int right = 20;
    	//变量进行加法运算
    	int result = left + right;
    	printf("result = %d 
    ",result);
    
    	system("pause");
    	return 0;
    }
    

    获取键盘输入

    在日常使用的程序中,例如淘宝、京东、天猫等等几乎都是带交互功能的,它们在购买商品时都需要登录账号信息。登录账号时就是用到了键盘的输入或者是扫码登录的输入。
    因为目前开发的C程序都是基于终端运行的,如果想要在终端是读取用户键盘的输入,可以使用C语言提供的scanf()函数来实现,该函数需要传递两个参数,分别是读取输入数据的格式符和变量的地址。
    例如读取整数的格式符就是%d,而之前提到过变量名只是代码空间内容的别称,如果想要获取变量的地址,需要在变量名左边加上地址符&。

    scanf()函数是阻塞式的,当用户输入数据之后,数据会存储到标准输入缓存区中,然后scanf()函数负责从标准缓冲区中拿指定格式的数据,如果用户不输入数据,那么程序会一直处于阻塞状态,直到用户输入数据按回车后程序继续往下执行。

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    /*
    	获取键盘的输入
    	@author liuguanglei ittimelinedotnet@gmail.com
    	@wechat 18601767221
    	@website ittimeline.net
    	@version 2020/02/28
    */
    int main(int argc, char* argv[])
    {
    
    	//声明并初始化一个整数变量,并赋值为0
    	int age = 0;
    	printf("请输入你的年龄
    ");
    
    	//scanf()用于获取键盘的输入
    	// scanf("提取数据的格式","变量地址")
    	//变量名只是空间的别名,如果想要获取变量的地址,需要在变量名前面使用&
    	//而且scanf()函数还是带阻塞的,当程序输出提示信息 请输入你的年龄 并换行之后程序就会阻塞,等待用户的输入
    	scanf("%d",&age);
    
    	//当用户从键盘输入一个整数并回车之后
    	//输出scanf()函数从键盘录入的年龄数据
    	printf("你的年龄是%d
    ",age);
    	system("pause");
    	return 0;
    }

    程序运行结果
    程序运行结果

    不同进制的输出

    C语言的整数默认是使用十进制表示的,而printf()函数的%d格式符是使用十进制输出,如果想要将整数以八进制的方式输出,使用格式符%o,如果想要将整数以十六进制的方式输出,可以使用格式符%x。
    C语言不支持二进制的整数常量以及二进制整数的输出。

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    /*
    	整型的三种进制输出形式
    	@author liuguanglei ittimelinedotnet@gmail.com
    	@wechat 18601767221
    	@website ittimeline.net
    	@version 2020/02/28
    */
    int main(int argc, char* argv[])
    {
    	 
    	int number = 0;
    	printf("请输入一个整数,按回车键结束
    ");
    	
    	//使用scanf()函数读取键盘输入的整数,并赋值给number
    	scanf("%d",&number);
    
    
    	//不同进制的输出不会改变数据,只是数据的表现形式发生了变化
    	printf("十进制的%d转换为八进制的结果是%o
    ",number,number);
    	//八进制的整数是以0开头
    	printf("十进制的%d转换为八进制的结果是%#o
    ",number,number);
    	printf("十进制的%d转换为十六进制的结果是%x
    ",number,number);
    	//十六进制的整数是以0x开头
    	printf("十进制的%d转换为十六进制的结果是%#x
    ",number,number);
    
    	system("pause");
    	return 0;
    }

    有符号数和无符号数的区别

    有符号数是有正负之分,而无符号数就是没有正负之分,只有0和正数。

    有符号数在计算机内部的表示二进制:数值二进制最高位为符号位,0表示正数,1表示负数,其他位为数据位。

    以两个字节的整数(+1)为例,其二进制的表示方式为 00000000 0000001,其中最高位是最左边的0,表示该数是一个正数。
    以两个字节的整数(-1)为例,其二进制的表示方式为 10000000 0000001,其中最高位是最左边的1,表示该数是一个负数。

    无符号数:没有没有符号位,即全是数据位
    以两个字节的整数(+1)为例,其二进制的表示方式为 00000000 0000001

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    /*
    
       有符号和无符号整型、长整型常量
    	@author liuguanglei ittimelinedotnet@gmail.com
    	@wechat 18601767221
    	@website ittimeline.net
    	@version 2020/02/28
    */
    int main(int argc, char* argv[])
    {
    
    	//有符号整型
    	// 10 默认是有符号的整型
    	printf("有符号整型%d
    ",10);
    	//10u表示无符号的整型
    	printf("有符号整型%u
    ",10u);
    
    
    	//有符号整型
    	// 10L 默认是有符号的长整型
    	printf("有符号长整型%ld
    ", 10L);
    	// 10u表示
    	printf("无符号长整型%lu
    ", 10LU);
    
    
    	system("pause");
    	return 0;
    }

    有符号和无符号变量

    C语言中基本基本数据类型的int,float,double默认都是有符号类型的,如果想要使用无符号的变量,需要在变量类型前面使用关键字unsigned。

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    /*
    
    	有符号整数变量
    	@author liuguanglei ittimelinedotnet@gmail.com
    	@wechat 18601767221
    	@website ittimeline.net
    	@version 2020/02/28
    */
    int main(int argc, char* argv[])
    {
    	//定义有符号变量 使用关键字sign ,但是基本数据类型默认就是有符号的类型
    
    	//int 默认就是有符号类型的整型变量
    	int num = 10;
    
    	//无符号变量使用 unsigned
    	unsigned int data = 20;
    
    	printf("无符号整数变量data =%u
    ",data);
    
    	system("pause");
    	return 0;
    }

    字符常量

    在日常生活中,字符的使用场景比数值(例如整数、浮点数)还要广泛,能够描述更多的信息,例如网络通讯协议。字符也是构成字符串的主要内容。
    C语言中的字符常量使用一对单引号('')包含起来,只能存储一个字符常量。
    而且C语言的字符变量使用char表示,char只占据一个字节,不能存储中文,如果存储中文,使用printf()函数的格式符输出时会得到一个解析失败的字符。

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    /*
    	字符常量和变量的使用
    	@author liuguanglei ittimelinedotnet@gmail.com
    	@wechat 18601767221
    	@website ittimeline.net
    	@version 2020/02/28
    */
    int main(int argc, char* argv[])
    {
    	//字符常量
    	// ''包含起来的单个字符,不能是中文,否则printf()函数的格式符%c无法正确解析
    	printf("char = %c
    ",'c');
    	printf("char = %c
    ",'刘');
    	//字符变量 使用char类型声明
    	char c = 'a';
    	printf("char = %c
    ", c);
    	printf("字符变量c占据的字节数量是%d
    ", sizeof(c));
    
    
    	system("pause");
    	return 0;
    }

    在计算机底层,任何数据都只能以二进制的0101表示,但是字符不是数值,那字符在计算机内存中如何存储呢?
    如果将字符与特定的数值一一对应起来,这张对应表就叫做ASC||表。无论Windows,Linux,macOS都适用。
    ASC||表
    如果char存储字符,实际上存储的是字符对应的ASC||值。例如存储字符'a'时,在计算机内部存储的是整数97

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    /*
    	字符和ASC||码表
    	@author liuguanglei ittimelinedotnet@gmail.com
    	@wechat 18601767221
    	@website ittimeline.net
    	@version 2020/02/28
    */
    int main(int argc, char* argv[])
    {
    
    	char a = 'a';
    	char A = 'A';
    	char zero = '0';
    
    	printf("%c对应的ASC||值是%d
    ",a,a);
    	printf("%c对应的ASC||值是%d
    ",A,A);
    	printf("%c对应的ASC||值是%d
    ",zero, zero);
    
    	system("pause");
    	return 0;
    }

    字符变量大小写转换

    因为字符变量的本质存放的是ASC||值,ASC||值是数值。既然是数值就可以进行算术运算(+ - * /)。因为char存储的实际上是整数,因此可以进行加减运,大写字母加上32 就可以转换成对应的小写字母了。
    小写字母减去32 就可以转换成对应的大写字母了

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    /*
    	字符的大小写转换
    	@author liuguanglei ittimelinedotnet@gmail.com
    	@wechat 18601767221
    	@website ittimeline.net
    	@version 2020/02/28
    */
    int main(int argc, char* argv[])
    {
    	char a = 'a';
    	char A = 'A';
    
    	//小写的字母a对应的ASC||值是97
    	printf("%c对应的ASC||值是%d
    ", a, a);
    	//大写的字母A对应的ASC||值是65
    	printf("%c对应的ASC||值是%d
    ", A, A);
    	//因为char存储的实际上是整数,因此可以进行加减运算
    	//大写字母加上32 就可以转换成对应的小写字母了
    	char lower = A + 32;
    	printf("lower = %c 
    ",lower);
    	//小写字母减去32 就可以转换成对应的大写字母了
    
    	char upper = a - 32;
    	printf("upper = %c 
    ", upper);
    
    	system("pause");
    	return 0;
    }

    常用的转义字符

    一些特殊的符号无法直接显示时,我们使用*来表示,*表示常用的转义字符。例如a表示发声,无法在终端上直接显示。
    在日常开发中还会使用到各种常用的转义字符,例如 实现tab的效果。转义字符 实现换行的效果,转义字符\实现路径转义。%%输出百分号。

    转义字符还可以使用八进制和十六进制表示,用于表示字符对应的ASC||码值

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <stdlib.h>
    /*
    
    	C语言的常用转义字符应用
    	@author liuguanglei ittimelinedotnet@gmail.com
    	@wechat 18601767221
    	@website ittimeline.net
    	@version 2020/02/28
    */
    int main(int argc, char* argv[])
    {
    	//声音无法输出在屏幕上显示,因此这里使用转字符a实现发声
    	printf("%c", 'a');
    	//日常开发中常用的转移字符 
    实现换行
    	printf("hello 
    ");
    	printf("world 
    ");
    	// 	 实现tab效果
    	printf("C	语	言	核	心	编	程
    ");
    	// 
     实现光标移到行首 由于光标移到行首,最终只会输出C语言核心编程
    	printf("CPrimerPlus%cC语言核心编程
    ", '
    ');
    	//路径转义 \表示路径转义 
    	//使用system函数使用电脑上的微信,调用成功的前提条件是电脑上安装了微信
    	system(""C:\Program Files (x86)\Tencent\WeChat\WeChat.exe"");
    	// %%实现输出百分号
    	printf("合格率为%%%d
    ", 90);
    
    	//八进制转义和十六进制转义
    	//八进制的62转换为十进制是50,50表示字符2
    	char ch = '62';
    	printf("八进制的转义字符62转换为字符的结果是%c 
    ", ch);//2
    	//十六进制的62转换为十进制是98,98表示的字符是b
    	ch = 'x62';
    	printf("十六进制的转义字符62转换为字符的结果是%c
    ", ch); //b
    	system("pause");
    	return 0;
    }
  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 校门外的树
    Java实现 蓝桥杯VIP 算法训练 统计单词个数
    Java实现 蓝桥杯VIP 算法训练 统计单词个数
    Java实现 蓝桥杯VIP 算法训练 开心的金明
    Java实现 蓝桥杯VIP 算法训练 开心的金明
    Java实现 蓝桥杯 算法训练 纪念品分组
    Java实现 蓝桥杯 算法训练 纪念品分组
    Java实现 蓝桥杯VIP 算法训练 校门外的树
    Java实现 蓝桥杯VIP 算法训练 统计单词个数
    Java实现 蓝桥杯VIP 算法训练 开心的金明
  • 原文地址:https://www.cnblogs.com/ittimeline/p/12973435.html
Copyright © 2011-2022 走看看