C语言-Day02

“C语言部分-Day02”

一、格式化输入和输出

1.1 格式化输出

格式化输出代码

int num = 10;
printf("num =  %d\n", num);

其中%d代表以整型形式解释这篇内存空间,并以十进制方式输出

1.1.1 格式化输出的转换说明

格式:%m.pX

X:以何种方式解释这片内存空间,如%d, %f

m:最大字段宽度,可以省略不写

printf("%4d\n", 1234);	// 输出:1234,正常按字段宽度输出
printf("%4d\n", 123);	// 输出: 123,默认右对齐输出,少的字段用空格填充
printf("%-4d\n", 123);	// 输出:123,改为左对齐输出
printf("%4d\n", 12345);	// 输出:12345,可以自动扩展宽度

p:精度,用于控制浮点数的小数位

printf("%f\n", 3.1415926);	// 输出: 3.141592, 默认6位小数
printf("%.0f\n", 3.1415926); // 输出:3
printf("%.3f\n", 3.1415926); // 输出:3.141

1.2 格式化输入

使用scanf格式化输入的代码

int num = 0;
int success = 0;
printf("请输入一个整数: ");
success = scanf("%d", &num);	// 返回值为处理成功的个数

对于字符串:

  • 普通字符:精确匹配
  • 空白字符:可以匹配任意多个【前置】空白字符,包括0个
char name[60] = "";
printf("请输入一串字符: ");
scanf("%s", &name);
printf("name = %s\n", name);

测试

输入:haris
输出:name = haris
    
输入:haris gong
输出:name = haris	// 空格后面的内容被忽略了

输入:             haris
输出:name = haris	// 前面的空格不影响

1.2.1 格式化输入的练习

练习一:了解分割

scanf("%d%d%f%f", &i, &j, &f, &g);
printf("i = %d, j = %d, f = %f, g = %f\n", i, j, f, g);

// 输入
1-20.3-4.0e3
    
// 输出
i = 1, j = -20, f = 0.300000, g = -4000.000000

练习二:空格的影响

int i, j;
scanf("%d%d", &i, &j);
printf("i = %d, j = %d", i, j);

// 输入
 5 / 96
     
// 输出
i = 5, j = -858993460

为什么j的值会异常?因为scanf只匹配前面的空白字符,空5空/空96在第二个时已经没有匹配上了,此时scanf函数已返回,后面的字符也不会匹配

二、数据类型

2.1 整数类型

整数类型分为:

​ 有符号整数:short、int、long、long long 等

​ 无符号整数:unsigned short、unsigned int、等

注意事项:

​ 1、在C语言中不明确规定个类型的字节大小,跟随机器不同有所变化

​ 2、但C语言规定了各种类型的最小大小,如int类型,最小2字节

​ 3、正常整型类型的大小排序符合基本规则:short < int < long < long long

在C语言中定义一个整数的代码:

// 有符号整数
int num  = -10;

// 无符号整数
unsigned int num = 10;

2.1.1 整数编码(重要)

编码:1001 0011

对于无符号(unsigned)整数,该编码代表147

2^7 + 0 + 0 + 2^4 + 0 + 0 + 2^1 + 2^0 = 147

对于有符号整数,该编码代表-109

1001 0011
// 第一个1代表负号权重
    
-2^7 + 0 + 0 + 2^4 + 0 + 0 + 2^1 + 2^0 = -109

为什么有符号整数会采用补码的方式?有利于CPU计算

可以利用加法器做减法运算:a - b = a + (-b)

2.1.2 整数的读写

读写整数:

  • %u 无符号十进制整数
  • %o 无符号八进制整数
  • %x 无符号十六进制整数
  • %d 有符号十进制整数

读写短整数:

  • 在u、o、x、d前面加h,如%hd

读写长整数:

  • 在u、o、x、d前面加l,如%ld

读写长整数:

  • 在u、o、x、d前面加ll,如%lld

2.2 浮点数类型

浮点类型分为:

  • float 单精度
  • double 双精度
  • long double 用于高精度计算,一般用不到

2.2.1 浮点常量

浮点数有多种表示方式,要么包含小数点,要么包含字母,如

57.0
57.
5.70e1
.57e2
570e-1

浮点常量默认是double类型,如需要表示float,需要在后面加上f

float f;
f = 1.0f;	// 不加f默认就是double类型

2.2.2 浮点数的读写

  • %f float类型读写
  • %lf double类型读写

2.3 字符类型

字符类型的定义

char c = 'a';

char类型大小为1字节,并采用ASC码表示

注意事项:

​ C语言把字符类型当做整型来使用,因此可以进行算术计算,如

char c = 'a';
printf("%d\n", c);	// 输出97
printf("%d\n", c + 8);	// 输出105
printf("%c\n", c + 8);	// 输出'i',对标ASC码

2.3.1 转义序列

转义序列,是不能直接输入的字符,带有特殊功能,分为两种:

字符转义序列:

  • \a alert
  • \n newline
  • \b backspce

数字转义序列:

  • 八进制表示形式,以\开头,后面最多接3个8进制数
  • 十六进制表示形式,以\x开头,后面接十六进制数

2.3.2 读写字符

方法一:使用scanfprinf函数输入输出

字符的读写使用%c,使用的时候注意它默认不会忽略空格

char c = 'a';
// 一般用法
scanf("%c", &c);	// 输入:空格空格t, 输出:空格
// 推荐用法
scanf(" %c", &c);	// 输入:空格空格t, 输出:t, 将自动忽略前面的空格

方法二:使用getcharputchar函数输入输出

一般使用:

char c = 'a';
c = getchar();	// 注意,也不会忽视前面的空格
putchar(c);

惯用法:

while(getchar() != '\n'); // 用于读取一行剩余的字符

2.4 布尔类型

布尔类型从C99开始定义,放在<stdbool.h>头文件中

#include <stdbool.h>

int main(void) {
	bool flag1, flag2, flag3, flag4, flag5;
	// 正常赋值
	flag1 = true;	// 1
	flag2 = false;	// 0

	// 赋值数字会怎样?
	flag3 = 1999;	// 1
	flag4 = -19321;	// 1
	flag5 = 0;	// 0
}

注意事项:

​ bool类型赋值,如赋值非零数,则为true,只有当赋值为0时,才是false


C语言-Day02
http://gsproj.github.io/2024/03/06/04_C++/01_C语言/day02/
作者
GongSheng
发布于
2024年3月6日
许可协议