C语言基础学习 - 初识 C 语言(一)
1. 第一个C语言代码: hello world!
#include <stdio.h>
int main(){
printf("hello world!");
return 0;
}
main()函数: 主函数, 程序的入口
printf()函数: 将传给函数的内容输出到显示器上
return: 返回, 程序的结束
2. 数据类型
\ | 数据类型 | 所占字节 | 表示范围 |
---|---|---|---|
char | 字符 | 1 | -128 -> 127 / 0->255 |
short | 短整型 | 2 | -32768 -> 32767 / 0 -> 65535 |
int | 整型 | 4 | -21亿 -> 21亿/ 0 -> 41亿9 |
long | 长整型 | 4 | -21亿 -> 21亿/ 0 -> 41亿9 |
long long | 更长的整型 | 8 | 非常大 |
float | 单精度浮点数 | 4 | |
double | 双精度浮点数 | 8 |
// 以下这些类型都是表示一个有符号的整数
// C语言中表示整数优先考虑 int
int a = 10;// 整型变量 -21亿 -> 21亿 / 0 -> 41亿9
printf("int %d\n", sizeof(a)); // 4
char s = 'e';// 字符类型变量,表示范围:-128 -> 127 / 0->255
printf("char %d\n", sizeof(s));// 1
short b = 23;// 短整型变量 表示范围:-32768 -> 32767 / 0 -> 65535
printf("short %d\n", sizeof(short));// 2
long c = 209299;// 长整型变量 表示范围:-21亿 -> 21亿/ 0 -> 41亿9
printf("long %d\n", sizeof(long));// 4
long long d = 34;// 长长整型变量 表示范围:非常大
printf("long long %d\n", sizeof(long long)); // 8
unsigned int x = 10;
// 小数 / 浮点数 表示范围? float表示精度非常低,通常优先考虑double
float e = 1.0;// 单精度浮点数 4字节
printf("float %d\n", sizeof(float));
double f = 1.0;// 双精度浮点数 8字节
printf("double %d\n", sizeof(double));
sizeof(): C语言中的运算符, 可以知道某一个变量或者数据类型在内所占字节数
%d: 格式化字符串, 表示我们要打印一个十进制的有符号的整数(区分正负数)
字符类型也是整数,ASCII 编码表描述了字符与数字的对应关系
无符号整数,在之前的数据类型前加 unsigned 即可,只能表示正数和 0
3. 变量
变量 – 可以改变的量; 有些数据是可以变化的, 例如: 工资,年龄, 体重等等. 变量分为局部变量和全局变量
3.1 分类
- 局部变量: 在{}内部定义的变量
- 全局变量: 在{}之外定义的变量
#include <stdio.h>
int a = 10; // 全局变量
int main(){
int b = 20;// 局部变量
return 0;
}
如果某个变量在某个函数内, 就是局部变量, 反之, 如果某个变量不在任何函数内, 就是全局变量
两者的作用域和生命周期不一样.
3.2 作用域
作用域( scope ),程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用的, 而限定这个名字的可用性的代码范围就是这个名字的作用域。
简单来说, 也就是变量哪里可以使用, 哪里就是它的作用域.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int g_var = 2022; // 全局变量
int main() {
printf("1. %d\n", g_var);
int a = 10;
{
int b = 20;
printf("%d\n", b); // 正确, 输出 20;
printf("2. %d\n", g_var);
}
printf("%d\n", a); // 正确, 输出 10;
// pritnf("%d\n", b); // 错误, 因为 b 变量只在上面的{}中有用;
printf("3. %d\n", g_var);
return 0;
在源文件 var01.c中
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int var_g = 100;
在源文件 var02.c中
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
// 声明变量
extern int var_g;
int main()[
printf("%d\n", var_g);
return 0;
}
在文件 var02.c 中虽然没有给 变量 var_g 一个具体的值, 但是因为我们在 var01.c 文件中声明并定义 var_g, 且在 var01.c 文件中使用关键字 extern 声明了变量 var_g, 所以在主函数可以打印变量 var_g.
局部变量的作用域: 就是局部变量所在的局部范围
全局变量的作用域: 整个项目中都可以使用, 如上面的 var_g 变量.
3.3 生命周期
变量的生命周期就是变量的创建和销毁的时间段.
局部变量的生命周期: 进入局部范围生命周期开始, 出局部范围生命周期结束, 如下面代码片段所示:
{
int a = 10;
printf("%d\n", a);
}
// printf("%d\n", a);// 错误, 局部变量 a 的生命周期已经结束;
全局变量的生命周期: 整个程序的生命周期
实际工作中不推荐使用全局变量,局部变量和全局变量名字可以相同,但是局部变量会覆盖全局变量
3.4 练习 – 求两个整数的和
#define _CRT_SECURE_NO_WARNINGS //必须程序的最上面
#include <stdio.h>
int main(){
int num1, num2;
printf("输入两个整数:");
scanf("%d %d", &num1, &num2);
int result = num1 + num2;
printf("两个数的和:%d\n", result);
}
scanf("%d", &num1);
其中 & 表示取地址, 上面这条语句表示将从键盘输入的数据存储到整型变量 num1 中
注意: 每次使用 scanf() 函数都要在程序首行添加 #define _CRT_SECURE_NO_WARNINGS
, 为了后面使用方便, 我们在 Visual Studio 的安装路径下找 newC++file.cpp 文件, 找到之后用记事本打开, 将需要自动生成的代码放进去保存. 后面新建的源文件会自动添加这些代码.(可以将任何你想让程序在新建文件时自动添加的代码放进去)
4. 常量
常量 – 不能改变的量; 生活中的一些数据是不能变化的,例如, 血型, 性别,圆周率等等.
C语言中的常量分为以下四种:·
- 字面值常量
3.14; 10;
等
3.14;// 浮点数常量
10;// 整型常量
"hello world";// 字符串常量
'c';// 字符常量
- const 修饰的常变量, 修饰的变量的值不能被改变; const 是 C语言中的一个关键字;
int num = 10;// num 是变量
const int n = 10; // n 值不能被修改
// n = 12; // 报错, 常量值在程序运行中不能通过赋值语句被修改
- #define 定义的标识符常量
#define M 100
宏定义: 没有数据类型, 没有赋值运算符;
- 枚举常量: 枚举往往是用来罗列一个事务的所有情况
enum Sex {
male,// 男性
female,// 女性
unknow,// 未知
};
上面的代码创建了三个常量, 分别是 male, female, ubknow.
5. 字符串
这种由双引号(Double Quote)引起来的一串字符称为字符串字面值(String Literal),或者简称字符串。
注:字符串的结束标志是一个\0
的转义字符。在计算字符串长度的时候\0
是结束标志,不算作字符串内容。字符
字符是由 '
引起来的, 且只能有一个字符, 不能包含多个字符. 如下面的代码片段所示:
'a'; // 字符
// 'ab';// 错误
"hello world";// 字符串
6. 转义字符
假设我们要在屏幕上打印一个目录: c:\test.c
printf("c:\test.c")
上面代码执行的结果如下图所示:
显然这不是我们想要的结果, 事实上是因为路径中有特殊的转义字符 \t
, 它在C语言中表示水平制表符 (tab), 类似于 \t
这样的存在叫做转义字符, 之前使用到的 \n
表示换行. 那如何在正确的将目录打印到屏幕上呢?
使用 \
, \\
表示字面值 \
(字面值: 字符本身), 也就是说想在屏幕上打印 \
, 在程序里需要用 \\
表示.如下面的代码所示:
printf("c:\\test.c")
打印效果如下图所示:
常见的转义字符如下表所示:
转义字符 | 释义 |
---|---|
\? | 在书写连续多个问号时使用, 防止它们被解析成三字母词 |
\’ | 用于表示字符常量 ’ |
\" | 用于表示一个字符串内部的双引号 |
\\ | 用于表示一个反斜杠,防止它被解释为一个转义序列符。警告字符,蜂鸣 |
\a | 警告字符,蜂鸣 |
\b | 退格符 |
\f | 进纸符 |
\n | 换行 |
\r | 回车 |
\t | 水平制表符 |
\v | 垂直制表符 |
\ddd | ddd表示1-3个八进制的数字。如:\130 |
\xddd | 如:130Xddd表示3个十六进制数字。如:\x030 |
// 假设打印 My name is "CY";
// printf("My name is "CY""); // 错误
printf("My name is \"CY\"");
6.1 练习
//程序输出什么?
#include <stdio.h>
#include <string.h>
int main()
{
printf("%d\n", strlen("abcdef"));// 6
// \62被解析成一个转义字符
printf("%d\n", strlen("c:\test\628\test.c"));// 14
return 0;
}
strlen(): 求字符串的长度, 想使用这个函数, 我们需要添加头文件 #include <string.h>
上面的代码有两个输出, 第一个输出是 6, 显而易见, 就是字符串的长度, 可是第二个输出的结果是 14, 而不是 18, 这是为什么呢? 因为第二个字符串包含多个转义字符, 除了两个 \t
, 其中的 \62
也是转义字符, 为什么不是 \628
是一个转义字符? 因为 \ddd
表示的是 1-3 个八进制的数字, 八进制的数字是使用 0 ~ 7 的数字表示的, 8 明显不属于八进制的表示, 但是这个转义字符具体表示的是什么? 我们可以使用语句 printf("\62");
来看它具体的含义. 62 是一个八进制整数, 表示十进制的 50, 然后我们可以查询 ASCII 表 50 对应的含义是什么.
7. 注释
//: 单行注释
/* */: 多行注释
// 注释
/* 多行注释
多行注释 */
不推荐使用多行注释, 因为多行注释不能嵌套.