目录
- 数据类型
- 1.1 数据类型介绍
- 1.2 字符型
- 1.3 整型
- 1.3.1 整型常量的表示
- 1.4 浮点型
- 1.5 布尔类型
- 各种数据类型的长度
- 2.1 sizeof()
- 2.2 数据类型长度
- singed和unsigned
- 变量
- 4.1 变量的创建
- 4.2 初始化变量
- 4.3 变量的分类
- 4.3.1 全局变量
- 4.3.2 局部变量
- 算术操作符:+ - * / %
- 赋值操作符 =
- 6.1 连续赋值
- 6.2 复合赋值符
- 单目操作符:++ -- + -
- 7.1 ++ 和 --
- 7.1.1 前置++ 和前置--
- 7.1.2 后置++ 和后置--
- 7.1.3 逗号表达式
- 7.2 + 和 -
- scanf和printf介绍
- 8.1 printf()
- 8.1.1 占位符
- 8.1.2 printf() 输出格式
- 8.1.3 限定宽度
- 8.2 scanf
- 8.3 赋值忽略符
一、数据类型
1.1 数据类型介绍
C 语言提供了丰富的数据类型来描述各种数据。整型类型描述整数,字符类型描述字符,浮点数类型描述小数。所谓“类型”就是相似的数据拥有的共同特征,编译器知道了数据的类型,才能更好地操作数据。下面盘点以下 C 语言提供的各种基本数据类型:
1.2 字符型
字符型支持转义字符和算术运算,用 printf 输出时,%c 格式符用于显示字符本身,%d 格式符用于显示对应的 ASCII 码,例如:[signed] char // 有符号字符型,大多编译器默认为char,即signed可省略
unsigned char // //无符号字符型
char c = 'a';
printf("%c\n", c); // 输出:a(显示字符)
printf("%d\n", c); // 输出:97(显示ASCII码)
1.3 整型
用于存储整数(不含小数部分)的基本数据类型,可分为://整型
int
[signed] int
unsigned int
//短整型
short [int]
[signed] short [int]
unsigned short [int]
//长整形
long [int]
[signed] long [int]
unsigned long [int]
//更长的整型
/C99 标准新增
long long [int]
[signed] long long [int]
unsigned long long [int]
1.3.1 整型常量的表示
| 表示形式 | 规则 | 示例 |
|---|---|---|
| 十进制 | 默认(无前缀) | 123、-456 |
| 八进制 | 以 0 开头 | 012(对应十进制 10) |
| 十六进制 | 以 0x 或 0X 开头 | 0x1a(对应十进制 26) |
1.4 浮点型
用于存储带小数部分的数值,C 语言中默认浮点数类型为 double 分为:float //单精度浮点数
double //双精度浮点数
long double //扩展精度浮点型
1.5 布尔类型
C 语?原来并没有为布尔值单独设置?个类型,?是使?整数 0 表?假,?零值表?真。在 C99 中也引?了 布尔类型 ,是专?表?真假的。 _Bool 布尔类型的使用需要包含头文件<stdbool.h>,布尔类型的变量取值是 TRUE 或者 FALSE。 例如下列代码:if 条件为真则打印输出_Bool flag = true;
if (flag)
printf("i like C\n");
注:自定义类型后面文章会介绍
2. 各种数据类型的长度
每一种数据的类型都有自己的长度,变量长度的不同,存储的数据范围就有所差异。2.1 sizeof()
sizeof 是关键字也是操作符,专门用来计算 sizeof 的操作数的类型长度,单位是字节。 sizeof 的操作数可以是类型,也可以是变量或者表达式。sizeof(类型)
sizeof 表达式
sizeof 操作数是表达式的时候,可以省略括号,并且表达式是不会真实参与运算,只会得出表达式的类型大小。
例如(sizeof 中表达式不计算)
short = 0;
printf("%zd\n", sizeof(int)); //4
printf("%zd\n", sizeof(3 + 3.5)); //8
printf("%d\n", sizeof(s=1+1)); //2
printf("s = %d\n", s); //0
sizeof 的计算结果是 size_t 类型,这是因为 sizeof 操作符的返回值,C 语言只规定是无符号整数,并没有规定具体的类型,而是由系统去决定。不同的系统中有的返回值类型是 unsigned int,也有的 unsigned long 等等。
因此 C 语言提供了一个解决方法,创造了类型为 size_t,用于统一 sizeof 的返回值类型。
2.2 数据类型长度
printf("%zd\n", sizeof(char)); //1
printf("%zd\n", sizeof(int)); //4
printf("%zd\n", sizeof(short int)); //2
printf("%zd\n", sizeof(long int)); //4
printf("%zd\n", sizeof(long long int)); //8
printf("%zd\n", sizeof(float)); //4
printf("%zd\n", sizeof(double)); //8
printf("%zd\n", sizeof(long double)); //8
printf("%zd\n", sizeof(_Bool)); //1
int a = 10;
int b = 20;
printf("%d\n", sizeof(a + b)); //4
3. signed 和 unsigned
C 语言使用 signed 和 unsigned 关键字 修饰字符型和整型类型。 signed 关键字 表示一个类型带有正负号,包含负值。 unsigned 关键字 表示一个类型不带有正负号只能表示零和正整数。 对于 int 类型,默认带有正负号,也就是说 int 等于 signed int int 类型也可以不带正负号,只表示非负整数,但是要使用 unsigned 声明变量,unsigned int 里面的 int 可以省略。 C 语言规定 char 类型是否带有正负号,由系统决定。也就是说 char 不等同于 signed char,它可能是 signed char,也有可能是 unsigned char。4. 变量
4.1 变量的创建
了解清楚了类型,我们使用类型做什么呢?类型是用来创建变量的。 那什么是变量呢?C 语言中把经常变化的值称为变量,不变的值称为常量。 变量创建的语法形式是这样的:data_type name;
| |
| |
数据类型 变量名
int a; //整形变量
char b; //字符型变量
double c; //浮点型变量
4.2 初始化变量
变量在创建的时候给一个初始值,就叫初始化。int a = 0;
char b = 'b'
double c = 3.14;
4.3 变量的分类
变量分为全局变量和局部变量。4.3.1 全局变量
全局变量是大括号外定义的变量,整个工程都能使用。4.3.2 局部变量
局部变量是大括号内定义的变量,使用范围比较局限,只能在自己所在局部范围内使用 如果局部变量和全局变量同名时,局部变量优先使用#include <stdio.h>
int a = 200;
int main()
{
int a = 100;
printf("%d ", a); //100
return 0;
//局部变量和全局变量同名的时候,局部变量优先
}
5. 算术操作符:+ - * / %
C 语言中为了便于运算,提供了一系列操作符,其中有一组操作符叫: 算术操作符。分别是: +、-、*、/、% ,这些操作符都是双目操作符。这是因为操作符两端都有操作数,所以叫双目操作符。5.1 +
用于完成加法运算
#include <stdio.h>
int main()
{
int a = 1;
int b = 2;
int c = a + 5;
int d = b + 3;
printf("%d %d\n", c, d); //6 7
return 0;
}
5.2 -
用于完成减法运算
#include <stdio.h>
int main()
{
int a = 1;
int b = 2;
int c = a - 5;
int d = b - 3;
printf("%d %d\n", c, d); //-4 -1
return 0;
}
5.3 *
用于完成乘法运算
#include <stdio.h>
int main()
{
int a = 5;
printf("%d\n", a * a); //25
return 0;
}
5.4 /
用来执行除法运算
如果除号两边是整数,进行的是整数除法,结果也是整数
#include <stdio.h>
int main()
{
float x = 6 / 4;
int y = 12 / 4;
printf("%d\n", y); //3
printf("%f\n", x); // 变量x的类型是float,但6/4得到结果应该是1.5,而不是1.0
//这是因为两个运算数必须至少有一个是浮点数,这样C语言才会进行浮点数的除法运算
float e = 6.0 / 4; //1.500000
printf("%f\n", e);
}注:若要得到浮点数的结果,两个操作数中至少有一个应为浮点数
5.5 %
运算符%表示求模运算,即返回两数相除的余数。仅适用于整数,不适用于浮点数。
负数求模的结果符号由第一个操作数决定。
#include <stdio.h>
int main()
{
printf("%d\n", 9 % 2); //1
printf("%d\n", -9 % 2); //-1
printf("%d\n", 9 % -2); //1
printf("%d\n", -9 % -2); //1
//模运算的正负号是由第一个运算数的正负号决定的
return 0;
}
6.赋值操作符 =
在变量创建时给予一个初始值称为初始化,在变量创建后再次赋值则称为赋值。
int a=0; //初始化
int a=100; //赋值
6.1 连续赋值
int a = 1;
int b = 2;
int c = 3;
int d = 0;
d = c = b = a + 1 //连续赋值,从右向左依次赋值的。尽管C语言支持连续赋值,但这样编写的代码不易理解,建议分开写以方便观察执行细节。
int a = 1;
int b = 2;
int c = 3;
int d = 0;
b = a+1;
c = b;
d = c;
6.2 复合赋值符
编程时可能需要对一个数值进行增或减的操作,例如:
int a = 1;
a = a+3;
a = a-2;C语言中提供了复合赋值符以简化写法,这些符号包括:
+= -=
*= /= %=?
>>= <<=
&= |= ^=例如:
int a = 1;
a += 3;
a -= 2;
7.单目操作符:++ -- + -
7.1 ++和--
++是一种自增的操作符,分为前置++和后置++。
--是一种自减的操作符,分为前置--和后置--。
7.1.1 前置++ 和前置--
int a = 10;
int b = 10;
++a; //11
--b; //9前置++:先加1再使用
前置--:先减1再使用
7.1.2 后置++和后置--
int a = 10;
int b = 10;
int c = a++
int d = b--
printf("%d %d ",a,c); //11 10
printf("%d %d ",b,d); //9 10后置++:先使用后加1
后置--:先使用后减1
7.1.3 逗号表达式
逗号表达式仅运算最后一个子表达式,整个表达式的值为最后一个子表达式的结果。
int a = 0;
int b = 0;
int c = 0;
int d = 0;
int x = 0;
x = (a++, b--, x = c + 10,--d); // -1
7.2 + 和 -
这里的+表示正号,-表示负号,均为单目操作符。
运算符+对数值的正负无影响,是一个可省略的操作符,但使用时不会报错。
运算符-用于改变一个值的正负号,负数前加上-会变为正数,正数前加上-则变为负数。
int a = -10;
int b = -a;
printf("b=%d\n", b); //这?的b是10
8. scanf和printf介绍
8.1 printf()
printf的功能是将参数文本输出到屏幕,f代表格式化,意味着可以定制输出文本的格式。
printf() 在标准库头文件 stdio.h 中定义。使用此函数前,需在源码文件头部包含该头文件。
8.1.1 占位符
占位符用于在此处插入其他值。printf的占位符类型丰富,与C语言的数据类型相对应。
以下按字母顺序列出常用的占位符:
%a :?六进制浮点数,字?输出为?写。
%A :?六进制浮点数,字?输出为?写。
%c :字符。
%d :?进制整数。
%e :使?科学计数法的浮点数,指数部分的 e 为?写。
%E :使?科学计数法的浮点数,指数部分的 E 为?写。
%i :整数,基本等同于 %d 。
%f :?数(包含float类型和double类型)。
%g :6个有效数字的浮点数。整数部分?旦超过6位,就会?动转为科学计数法,指数部分的e为?写。
%G :等同于%g ,唯?的区别是指数部分的E为?写。
%hd :?进制 short int 类型。
%ho :?进制 short int 类型。
%hx :?六进制 short int 类型。
%hu :unsigned short int 类型。
%ld :?进制 long int 类型。
%lo :?进制 long int 类型。
%lx :?六进制 long int 类型。
%lu :unsigned long int 类型。
%lld :?进制 long long int 类型。
%llo :?进制 long long int 类型。
%llx :?六进制 long long int 类型。
%llu :unsigned long long int 类型。
%Le :科学计数法表?的 long double 类型浮点数。
%Lf :long double 类型浮点数。
%n :已输出的字符串数量。该占位符本?不输出,只将值存储在指定变量之中
%o :?进制整数。
%p :指针。
%s :字符串。
%u :?符号整数(unsigned int)。
%x :?六进制整数。
%zd :size_t 类型。
%% :输出?个百分号。
8.1.2 printf()输出格式
printf() 可以定制占位符的输出格式。
8.1.3 限定宽度
printf() 允许设定占位符的最大宽度。
#include <stdio.h>
int main()
{
printf("%5d\n", 123); // 输出为" 123"
return 0;
}%5d 表示该占位符至少宽5个字符。如果不足5个字符,值的前面会补充空格。
输出默认右对齐,即内容前有空格;若要左对齐,在输出内容后添加空格,并在占位符%后加-号。
#include <stdio.h>
int main()
{
printf("%-5d\n", 123); // 输出为"123 "
return 0;
}
对于数字,限定符会限制所有数值的最小显示宽度。
printf("%12f\n",123.45); // 123.450000
printf("%.1f\n",123.45); //123.5
printf("%6.2f\n", 0.5); // 0.50上述示例中,%12f 表示输出的浮点数至少占12个字符。由于浮点数默认显示精度到小数点后6位,因此123.45 输出时会在头部补充2个空格。
%.1f 表示输出的浮点数保留一位小数,多余部分四舍五入。
%6.2f 表示输出字符串最小宽度为6,小数位数为2。因此,输出字符串前会补充两个空格。
最小宽度和小数位数这两个限定值可用*代替,通过 printf() 的参数传递。
printf("%*.*f\n",6,2,0.5); // 0.50
%s 占位符用于输出字符串,默认全部输出。如果只想显示部分内容,可以使用%.[m]s指定输出长度,其中[m]代表一个数字,表示所需输出的长度。
printf("%.5s\n", "hello world"); //hello
8.2 scanf
scanf() 函数用于读取用户的键盘输入。当用户完成数据输入并按回车键后,scanf() 将处理这些输入,并将其存储到变量中。
scanf("%d", &i);第一个参数是一个格式字符串,其中放置占位符,告知编译器如何解析用户的输入,需要提取的数据类型为何。这是由于C语言中的所有数据都有类型,scanf() 必须预先知道用户输入的数据类型,才能正确处理数据。
注意:变量前必须加上&运算符(指针变量除外),因为 scanf() 传递的不是值而是地址,即将变量 i 的地址指向用户输入的值。如果这里的变量是指针变量(如字符串变量),则不必加 & 运算符。
当处理数值占位符时,scanf() 自动过滤空白字符,包括空格、制表符和换行符等。需要注意的是除了 %c 以外,所有其他输入都会自动忽略起始的空白字符。
%c 不忽略空白字符,总是返回当前第一个字符,无论该字符是否为空格。
若要强制跳过字符前的空白字符,可以写成 scanf(" %c", &ch); 在%c 前加一个空格,表示跳过零个或多个空白字符。
还有 %s,不能简单地等同于字符串。
其规则是,从当前第?个非空格字符开始读取,直到遇到空白符(即空格、换行符、制表符等)为止。由于%s不会包含空格符,因此无法用来读取多个词汇,除非多个%s连用。这也意味着,scanf()不适用于读取可能含有空格的文本,例如书名或歌曲名称。此外,当遇到
scanf()
中的
%s
占位符时,会在字符串变量末尾存储一个终止字符 \0。
8.3 赋值忽略符
用于处理用户输入可能不符合预设格式的情况
scanf("%d-%d-%d", &year, &month, &day);
printf("%d %d %d\n", year, month, day);
如果用户输入2025-11-11,则会正确解析出年月日。但如果用户以其他格式如2025/11/11输入,这种情况下,scanf就会解析失败。
为了避免这种情况,scanf() 提供了一个赋值忽略符 *,将其添加在任何占位符的百分号后,该占位符就不会返回值,解析后的数据将被丢弃。这样无论用户输入2025-11-11、2025/11/11或2025~11~11都能正确解析。
#include <stdio.h>
int main()
{
int y = 0;
int m = 0;
int d = 0;
scanf("%d%*c%d%*c%d", &y, &m, &d);
//输入2025/11/7就会输出2025 0 0 造成解析数据失败。
//把 * 加在任何占位符的百分号后?,该占位符就不会返回值,解析后将被丢弃
//表?这个占位符没有对应的变量,解读后不必返回。
printf("%d %d %d\n", y, m, d);
}

雷达卡


京公网安备 11010802022788号







