1.数据类型
2.数据类型的大小
3.变量和常量
4.变量的命名
5.局部变量和全局变量
6.printf和scanf的使用方法
7.变量的使用以及scanf使用问题
8.变量的作用域和生命周期
9.常量
在计算机中,不同的数据在内存中占用不同大小的存储单元,而且它们所能表示的数据的取值也不同,为了方便我们在计算机中存入不同数值的数据,于是引入了数据类型。
例如:20 - 整数 - 整型 - int
25.2 - 小数 - 浮点型 - flaot、double
char //字符数据类型
short //短整型
int //整形
long //长整型
long long //更长的整形
float //单精度浮点数
double //双精度浮点数
在C99中还引入了 _Bool - 布尔类型 和 long doubel - 长双精度浮点型
在现实生活中,我们放书都要放在某个格子里面。数据也是如此,数据想要存储,就需要在计算机的内存中开辟一段空间,至于开辟空间的大小,就取决于该数据存储时的数据类型。
"%d" - 以十进制的形式打印数据。
sizeof - 操作符 - 计算数据类型在计算机中所占内存空间的大小 - 单位是字节
#include
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啦。
这里我们详细了解一个变量创建的过程
常量:在程序中不能改变的其值的量。按照类型划分有以下几种:整型常量、实型常量、字符型常量、字符串字面量、枚举常量。
变量:变量不同与常量,其值在程序执行的过程是可以变化的。
定义变量的形式为:类型 变量名
int mian()
{
//定义变量的形式为:类型 变量名
//定义年龄变量
int age;
//定义体重变量并赋予初值
float weight = 66.6f;
//这里 66.6f 带 f 是因为 66.6 在编译器中默认是double类型,加上f后就成为float类型
return 0;
}
1.只能由字母(包括大写和小写)、数字和下划线( _ )组成。
2.不能以数字开头。
3.长度不能超过63个字符。
4.变量名中区分大小写的。
5.变量名不能使用关键字。
int a = 100;//全局变量 - 代码块外
int main()
{
int a = 10;//局部变量 - 代码块外
printf("%d\n", a);
return 0;
}
此时输出的值为多少呢?100?还是10?
输出结果为10,printf优先选择最近的变量a的值,可以理解为"局部遍历优先原则"。
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
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;
}
先来看一段代码
#include
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)
输入上面两个任何一个就可以使程序正常运行了。
作用域
作用域(scope)是程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用的而限定这个名字的可用性的代码范围就是这个名字的作用域。
1. 局部变量的作用域是该局部变量所在的局部范围。
#include
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
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
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
int a = 0;//全局变量
int main()
{
//此时变量a的生命周期就是程序的生命周期
//两者共存亡
return 0;
}
C语言中的常量分为以下以下几种:
1.字面常量
3、3.14、'a'、"abcdef"
2.const 修饰的常变量
#include
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
//#define 定义的标识符常量
#define SIZE 10
int main()
{
int a = SIZE;
int arr[SIZE] = { 0 };
//#define 定义的标识符常量 - 彻彻底底的常量
return 0;
}
4.枚举常量
#include
//枚举常量
//枚举 - 一一列举
//生活中有些值是可以意义列举的
//三原色:红、绿、蓝
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;
}