1.数据类型
在计算机中,不同的数据在内存中占用不同大小的存储单元,而且它们所能表示的数据的取值也不同,为了方便我们在计算机中存入不同数值的数据,于是引入了数据类型。
例如:20 - 整数 - 整型 - int
25.2 - 小数 - 浮点型 - flaot、double
char //字符数据类型 short //短整型 int //整形 long //长整型 long long //更长的整形 float //单精度浮点数 double //双精度浮点数
在C99中还引入了 _Bool - 布尔类型 和 long doubel - 长双精度浮点型
2.数据类型的大小
在现实生活中,我们放书都要放在某个格子里面。数据也是如此,数据想要存储,就需要在计算机的内存中开辟一段空间,至于开辟空间的大小,就取决于该数据存储时的数据类型。
"%d" - 以十进制的形式打印数据。
sizeof - 操作符 - 计算数据类型在计算机中所占内存空间的大小 - 单位是字节
#include <stdio.h> int main() { printf("%d\n", sizeof(char));//1 printf("%d\n", sizeof(short));//2 printf("%d\n", sizeof(int));//4 printf("%d\n", sizeof(long));//4 printf("%d\n", sizeof(long long));//8 printf("%d\n", sizeof(float));//4 printf("%d\n", sizeof(double));//8 printf("%d\n", sizeof(long double));//8 return 0; }
计算机中的单位:
//计算机中的单位: /* bit 比特位 Byte 字节 = 8 bit KB = 1024 Byte MB = 1024 KB GB = 1024 MB TB = 1024 GB PB = 1024 TB */ //计算机识别的是 二进制 0/1 //而十进制则是 0/1/2/3/4/5/6/7/8/9
这里很奇怪,为什么sizeof(int) 和 sizeof(long)大小一样呢?难道整型和长整型是一样的吗?
其实C语言标准规定:
sizeof(int) <= sizeof(long)
这里取4是由于我们当前是32位平台,在64位平台上它就是8啦。
这里我们详细了解一个变量创建的过程
3.变量和常量
常量:在程序中不能改变的其值的量。按照类型划分有以下几种:整型常量、实型常量、字符型常量、字符串字面量、枚举常量。
变量:变量不同与常量,其值在程序执行的过程是可以变化的。
定义变量的形式为:类型 变量名
int mian() { //定义变量的形式为:类型 变量名 //定义年龄变量 int age; //定义体重变量并赋予初值 float weight = 66.6f; //这里 66.6f 带 f 是因为 66.6 在编译器中默认是double类型,加上f后就成为float类型 return 0; }
4.变量的命名
1.只能由字母(包括大写和小写)、数字和下划线( _ )组成。
2.不能以数字开头。
3.长度不能超过63个字符。
4.变量名中区分大小写的。
5.变量名不能使用关键字。
5.局部变量和全局变量
int a = 100;//全局变量 - 代码块外 int main() { int a = 10;//局部变量 - 代码块外 printf("%d\n", a); return 0; }
此时输出的值为多少呢?100?还是10?
输出结果为10,printf优先选择最近的变量a的值,可以理解为"局部遍历优先原则"。
6.printf和scanf的使用方法
scanf 和 printf,库函数 - C语言编译器提供的现成的函数,直接可以使用。使用的时候要包含头文件stdio.h。
1.scanf的作用是输入数据,数据从键盘读取到内存中。
函数原型是: int scanf( const char *format [,argument]... );
2.printf的作用是输出数据,数据从内存打印(输出)到屏幕上
函数原型是:int printf( const char *format [, argument]... );
这里的const char *format就是格式,以下是常见的格式:
//%c - 字符 //%d - 整型 //%s - 字符串 //%f - 单精度浮点数 //%lf - 双精度浮点数 //%p - 地址的打印
#include<stdio.h> int main() { //输入并输出一个整数 int a = 0; scanf("%d", &a);// - 取地址a - 取出a的地址 //%d - 输入的格式 //&a - 这里需要的是地址,表示存放在哪里 printf("%d", a); //%d - 输入的格式 //a - 这里变量,表示从内存中拿到数据 //输入并输出一个字符 char ch = 0; scanf("%c", &ch); printf("%c", ch); return 0; }
7.变量的使用以及scanf使用问题
先来看一段代码
#include<stdio.h> int main() { //写一个代码,求两个整数的和 int num1 = 0; int num2 = 0; int sum = 0; //输入两个整数的和 scanf("%d %d", &num1, &num2); sum = num1 + num2; printf("%d\n", sum); return 0; }
此时程序出现错误了,但是我们的代码没有什么问题呀!为什么呢?这是因为在vs2022中该函数不安全,为了代码的跨平台性,我们仍然要使用scanf函数。
解决办法:
1.#define _CRT_SECURE_NO_WARNINGS 1
2.#pragma warning(disable:4996)
输入上面两个任何一个就可以使程序正常运行了。
8.变量的作用域和生命周期
作用域
作用域(scope)是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用的而限定这个名字的可用性的代码范围就是这个名字的作用域。
1. 局部变量的作用域是该局部变量所在的局部范围。
#include<stdio.h> int main() { { int a = 100;// - 局部变量 printf("%d", a);//a在其作用域内可正常使用 } //printf("%d", a); //此时程序报错:error C2065: “a”: 未声明的标识符 //证明a变量出了作用域就不可以使用 - a在出作用域后就被释放了 //当我们把修改一下: /* int a = 100; { } printf("%d", a); */ //此时变量a又可以使用了 return 0; }
2. 全局变量的作用域是整个工程。
不同的源文件定义的变量一定不要重名。
#include<stdio.h> int a = 20;//全局变量 extern int b;//声明外部文件的变量 void test() { //test函数使用变量a - 可以打印a的值 printf("2--->%d", a); } int main() { //main函数使用变量a - 可以打印a的值 printf("1--->%d", a); test();//调用自己创建的函数test //调用新建源文件test.c的变量b printf("test.c-->%d", b); //此时也报错了,是不是不能用呢 //其实不是 - 此时错误是error C2065: “b”: 未声明的标识符 -\ 而不是未定义的标识符 - 说明变量已经存在 - 只需声明即可 - 声明外部符号\ extern - 声明外部文件的关键字 //此时就可以运行出b的值了 return 0; }
生命周期
变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段
1. 局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
#include<stdio.h> int main() { { int a = 1; int b = 2; int c = a + b; printf("%d", c); //在这范围内是变量a,b,c的生命周期 } //执行顺序是: //进入主函数 //创建变量a,为其分配内存空间,存放数据1 //创建变量b,为其分配内存空间,存放数据2 //创建变量c,为其分配内存空间,存放数据a+b //打印 //销毁变量a,b,c的空间,a,b,c就不能使用 - 把空间还给操作系统 //结束main函数 //变量创建的本质:在内存中开辟一段空间,存放数据 return 0; }
2. 全局变量的生命周期是:整个程序的生命周期。
#include<stdio.h> int a = 0;//全局变量 int main() { //此时变量a的生命周期就是程序的生命周期 //两者共存亡 return 0; }
9.常量
C语言中的常量分为以下以下几种:
1.字面常量
3、3.14、'a'、"abcdef"
2.const 修饰的常变量
#include<stdio.h> int main() { //a是变量 //int a = 3; //const修饰常变量a - a具有常属性 - 不能改变 -\ 本质还是变量 const int a=3; printf("%d\n", a); //a = 10;//error //此时报错:左值指定 const 对象 printf("%d\n", a); int n = 10; int arr[n]; //error //数组 arr[] 的[]内容必须是常量表达式或者常量 const int n = 10; int arr[n]; //error //数组 const修饰的仍然是变量 - 常变量 return 0; }
3.#define 定义的标识符常量
#include<stdio.h> //#define 定义的标识符常量 #define SIZE 10 int main() { int a = SIZE; int arr[SIZE] = { 0 }; //#define 定义的标识符常量 - 彻彻底底的常量 return 0; }
4.枚举常量
#include<stdio.h> //枚举常量 //枚举 - 一一列举 //生活中有些值是可以意义列举的 //三原色:红、绿、蓝 enum COLOR { //列举了枚举类型enum COLOR的可能取值 RED, GREEN, BLUE }; int main() { //RED = 5;//不可修改 - 枚举常量 printf("%d", RED);//0 printf("%d", GREEN);//1 printf("%d", BLUE);//2 return 0; }