顺序程序设计
1、常量
常量:不能被改变的值
1.1 数字常量
举个简单的栗子:
12,23.4,12.5f 等均是数字常量(字面常量)
12 = 23; // error
23.4 = 45.6; // error
1.2 字符常量
举个简单的栗子:
‘\0’,‘0’,‘A’,‘a’,‘\n’ 等均是字符常量
对应的ASCII码值:
1.3 字符串常量
举个简单的栗子:
“0”,“abcd”
1.4 宏定义
宏定义就是字符替换
【格式】#define 宏名 值
例如:
#define PI 3.14
PI = 3.14159; // error,等同于3.14 = 3.14159
1.5 const 常量
const int a = 10;
a = 20; // error
2、变量
变量:能被修改的值
定义:数据类型,变量名
例如:
int a = 0;
a = 10; // ok
标识符命名规则:
- 以字母、下划线_、数字开头
- 只能以字母或下划线开头
- 不能使用关键字
- 区分大小写(对大小写比较敏感)
合法的标识符:abc、a1、_a、a_b、A、Float
非法的标识符:1a、a*b、float
3、数据类型
char short int long longlong float double
char 类型的取值范围: -128 ~ 127
unsigned char 类型的取值范围: 0 ~ 255
char 类似是 mini 的整型
char ch = ‘a’;
printf(“%c, %d\n”, ch, ch); // 输出:a,97
printf(“%c, %d\n”, 98, 98); // 输出:b,98
4、输出函数 printf
常用的格式化符,%d,%c,%f,%s,%x,%X,%08x
printf("%d, %d\n", 98, 'b'); // 输出:98 98. %d 用于输出十进制数
printf("%c, %c\n", 99, 'c'); // 输出:c c. %c 用于输出十进制数
printf("%f, %f\n", 12.5f, 23.4); // 输出:12.500000 23.400000 98. %f 用于输出float和double
printf("%s\n", "abc"); // 输出:abc. %s 用于字符串的输出
char* str = "hello";
printf("%s\n", str); // 输出:hello
printf("%x\n", 20); // 输出:14 %x 用于输出十六进制的数组 0x14 == 20
printf("%x, %X\n", 180, 180); // 输出:b4, B4
printf("%08x\n", 100); // 重点,输出00000064.08 表示输出8个十六进制数,不足左边补0
输出结果:
【常见的错误】
printf("%d\n", 12.5); // error 格式化符和数据不匹配,应该使用 %f
printf("%d\n"); // error 漏写输出的数据
5、输入函数 scanf
scanf(“格式化符”, 地址列表);
int a;
int b;
scanf("%d%d", &a, &b); // 从键盘输入 10 20 读取成功
scanf("%d%d", &a, &b); // 从键盘输入 10,20 读取b失败
scanf("%d,%d", &a, &b); // 从键盘输入 10 20 读取b失败
scanf("%d,%d", &a, &b); // 从键盘输入 10,20 读取成功
scanf("%d%d", a, b); // 从键盘输入 10,20 程序崩溃
scanf("%d%d\n", &a, &b); // 从键盘输入 10,20 程序停不下来,直到输入\n
float c;
scanf("%d", &c); // error 格式化符和数据不匹配,读取float使用%f,读取double使用%lf
【注】scanf 函数非常容易出错,使用 scanf 读取数据后一定要利用 printf 验证一下数据是否读取成功。尽量少使用 scanf 函数
scanf的不安全性
关于为什么VS编译器中会显示 scanf 函数不安全,我们举个简单的栗子:
【分析】
我们首先定义了一个 char 类型的、大小为5的数组 ar,这时系统会在栈区给数组ar分配5个字节的地址空间
当程序运行时,我们从键盘上输入:“hello world”,这很明显大于5个字节,由于 scanf 函数并不会检查输入值的长度是否会越界访问
,所以当我们使用 scanf 函数的时候,会存在数组越界访问的风险,而数组越界访问的后果时非常严重的,它可能导致我们的系统崩溃
但是当我们在 VS 上运行上述代码时,编译器会有 Debug Error 的提示,这样就很好的提示程序员,从而避免输入非法字符串,保证程序的安全、正常运行
解决scanf的不安全问题的几种方法
1. 使用 scanf_s
函数替代
int scanf_s(
const char *format [,
argument]...
);
// format:格式控制字符串。 argument:可选参数。
举个简单的栗子:
char s[10];
scanf_s("%9s", s, (unsigned)_countof(s)); // buffer size is 10, width specification is 9
2. 使用宏 #define _CRT_SECURE_NO_WARNINGS 1
#define _CRT_SECURE_NO_WARNINGS 1
缺点就是,每次新建一个 .c 源文件都需要在头部加上这个预处理命名,十分繁琐
3. 取消SDL检查
6、其它的输入输出函数
- getchar:读取一个字符
- putchar:输出一个字符
- gets:读取一行字符,这个函数比较危险,不建议使用
- puts:输出一行字符
char ch;
ch = getchar(); // 从键盘上读取一个字符存放在 ch 中
putchar(ch); // 输出 ch 中的字符
char str[100];
gets(str); // 读取一行的字符存放在 str 中
puts(str); // 输出 str
7、真题演练
int main()
{
printf("%d\n", printf("0123 "));
return 0;
}
其输出结果为:
printf的返回值就是输出的字符数量(包括换行符在内,也算一个字符)