数值溢出 & 输入输出函数 & 运算符 & 条件、循环语句
文章目录
1. 数值溢出
-
如果 int 类型变量,已经取最大值(2147483647),再给这个变量 +1。就发了溢出。
- 上溢出:最大值+1
- 下溢出:最小值-1
1.1 无符号数
- 取值范围 0 ~ 232-1
- 最大值 + 1 ——> 0
- 0 -1 ——> 最大值。
// 上溢出
int main(void)
{
unsigned int a = UINT_MAX; // 取出无符号最大值
printf("最大值+1 = %d\n", a + 1); // 0
printf("最大值+2 = %d\n", a + 2); // 1
return 0;
}
// 下溢出
1.2 有符号数
-
上溢出
- 最大值+1,上溢出 == 最小值。
int main(void) { int a = INT_MAX; // 取出无符号最小值 printf("最大值+1 = %d, 最小值 = %d\n", a+1, INT_MIN); return 0; }
-
下溢出
- 最小值-1,下溢出 == 最大值。
1.3 小结
- 大部分编译器,对于数值溢出,采用上述处理方式。但,个别编译器有可能不能。
- 受数值溢出影响,进行数据存储时,要选择恰当的数据类型。389482390483209 — int
2. 不常用关键字(了解)
- extern:
- 表示声明。声明没有内存空。不能提升为定义。
- const:
- 限制一个变量为只读。—— 常量。
- Volatile:
- 防止编译优化。
- register:
- 定义一个寄存器变量。 没有内存地址。
3. 输入输出函数
3.1 输出函数
-
printf();
- %d、%c、%x、%u、%s …
-
putchar() 函数:
- 输出一个字符到屏幕。
- ‘abcZ’ 是错误的定义,既不是 char 也不是字符串。
putchar(97); // 97 == 'a' putchar('\n'); // 输出换行符。 putchar('b'); putchar('\n'); // 使用评率较高。 printf("\n"); putchar('abcZ'); //‘abcZ’是错误的定义,既不是 char 也不是字符串。
3.2 输入函数
3.2.1 scanf 函数
使用
-
安装指定个格式匹配符,获取指定类型数据。
-
获取整数
-
int a; // 可以定义a变量(有内存空间),也可以声明(自动提升成定义,有内存空间) scanf("%d", &a); // &: 取变量a的地址 ——> 拿到a的内存空间。
-
示例:
-
// scanf 输入 int main(void) { //int a = 10; int a; // 在scanf执行时,会提示为定义。 int ret = scanf("%d", &a); //scanf可以从键盘获取用户输入,用户根据 %d 输入整数。 printf("获取的a为:%d\n", a); return EXIT_SUCCESS; }
-
一次性获取多个整数
-
常见的错误书写方法
int a, b, c; // 一次性创建多个 int 类型变量。 // scanf 可以从键盘获取用户输入, 用户根据 多个%d 输入整数。 int ret = scanf("%d%d%d", &a, &b, &c); // 上述写法编译器无法识别,输入的 123 应该怎样分配给 3 个 %d
-
正确的书写方式: (推荐)
int main(void) { int a, b, c; // 一次性创建多个 int 类型变量。 // scanf 可以从键盘获取用户输入, 用户根据 多个%d 输入整数。 int ret = scanf("%d %d %d", &a, &b, &c); printf("获取的a为:%d\n", a); printf("获取的b为:%d\n", b); printf("获取的c为:%d\n", c); return EXIT_SUCCESS; }
-
-
获取字符
// scanf 输入,获取字符。 int main(void) { char ch1, ch2, ch3; // 一定性创建多个 char 变量 printf("请输入3个字符,用空格隔分:"); scanf("%c %c %c", &ch1