目录
3.1. 除号的两端如果是整数,执行的是整数除法,得到的结果也是整数。
3.2. 如果希望得到浮点数的结果,两个运算数必须⾄少有⼀个浮点数,这时 C 语⾔就会进⾏浮点数除法。
浮点数(float)
在C语言中要写为 0.0f 就是在小数后面要加上 f 。如果少了 f 则会被认为double类型。
1.数据类型介绍
![](https://img-blog.csdnimg.cn/direct/a4785d7f5c69489d8f21e0f730f27f33.png)
内置函数(系统定义):字符型 -- 字符、整型 -- 整数、 浮点型 -- 小数、 布尔类型 -- 判断真 \ 假
自定义函数(自己定义):以后再讲
1.字符型
char //character
[signed] char //有符号的
unsigned char //⽆符号的
2.整型
//短整型
short [int]
[signed] short [int]
unsigned short [int]
//整型
int
[signed] int
unsigned int
//⻓整型
long [int]
[signed] long [int]
unsigned long [int]
//更⻓的整型
//C99中引⼊
long long [int]
[signed] long long [int]
unsigned long long [int]
3.浮点数
float //单精度浮点型
double //双精度浮点型
long double //在C99中,更大取值范围的浮点型
4.布尔类型
_Bool
#define bool _Bool
#define false 0
#define true 1
在vs2022中布尔类型 _Bool 可以简写为 bool
代码演示:
_Bool flag = true;
if (flag)
printf("i like C\n");
因为令flag 为true(正确的)所以输出i like C。
如果为flase (错误) 无法输出。
5.各种数据类型的长度
1.sizeof 操作符
sizeof( 类型 )
sizeof 表达式
![](https://img-blog.csdnimg.cn/direct/028b22c2a8274244bd7cf520f6f87b65.png)
- sizeof 的操作数如果不是类型,是表达式的时候,可以省略掉后边的括号的。
- sizeof 后边的表达式是不真实参与运算的,根据表达式的类型来得出大小。
- sizeof 的计算结果是 size_t 类型的。
代码示例:
#include <stdio.h>
int main()
{
int a = 10;
printf("%zd\n", sizeof(a));
printf("%zd\n", sizeof a);//a是变量的名字,可以省略掉sizeof后边的()
printf("%zd\n", sizeof(int));
printf("%zd\n", sizeof(3 + 3.5));
return 0;
}
答案:
因为int整数,占4个字节。第四个为什么是8个字节。因为3+3.5 前者为int 后者为double 两者相加为double类型,占8个字节。
2.数据类型长度
#include <stdio.h>
int main()
{
printf("%zd\n", sizeof(char));
printf("%zd\n", sizeof(_Bool));
printf("%zd\n", sizeof(short));
printf("%zd\n", sizeof(int));
printf("%zd\n", sizeof(long));
printf("%zd\n", sizeof(long long));
printf("%zd\n", sizeof(float));
printf("%zd\n", sizeof(double));
printf("%zd\n", sizeof(long double));
return 0;
}
运行结果:
3.sizeof 中表达式不计算
#include <stdio.h>
int main()
{
short s = 2;
int b = 10;
printf("%d\n", sizeof(s = b+1));
printf("s = %d\n", s);
return 0;
}
运行结果:
#include <stdio.h>
int main()
{
short int n = 4;
int m = 12;
//%u -- unsigned int
printf("%zd\n", sizeof(n = m + 3));//1
printf("%d\n", n);//2
return 0;
}
运行结果:
第一个printf 输出的结果为2字节。因为他是短整型占2个字节。
注意:不是打印赋值操作的结果大小,而是表达式 m + 3 的结果类型(int)的大小
2.signed 和 unsigned
signed int a;
// 等同于int a;
unsigned int a;
unsigned a;
#define SHRT_MIN (-32768) //有符号16位整型的最⼩值
#define SHRT_MAX 32767 //有符号16位整型的最⼤值
#define USHRT_MAX 0xffff //⽆符号16位整型的最⼤值
#define INT_MIN (-2147483647 - 1) //有符号整型的最⼩值
#define INT_MAX 2147483647 //有符号整型的最⼤值
signed char c; // 范围为 -128 到 127
unsigned char c; // 范围为 0 到 255
3.数据类型的取值范围
- SCHAR_MIN , SCHAR_MAX :signed char 的最小值和最大值。
- SHRT_MIN , SHRT_MAX :short 的最小值和最大值。
- INT_MIN , INT_MAX :int 的最小值和最大值。
- LONG_MIN , LONG_MAX :long 的最小值和最大值。
- LLONG_MIN , LLONG_MAX :long long 的最小值和最大值。
- UCHAR_MAX :unsigned char 的最大值。
- USHRT_MAX :unsigned short 的最大值。
- UINT_MAX :unsigned int 的最大值。
- ULONG_MAX :unsigned long 的最大值。
- ULLONG_MAX :unsigned long long 的最大值。
4.变量
1.变量的创建
data_type name;| || |数据类型 变量名
int age; //整型变量
char ch; //字符变量
double weight; //浮点型变量
int age = 18;
char ch = 'w';
double weight = 48.0;
unsigned int height = 100;
也可以进行数据覆盖:
2.变量的分类
- 全局变量:在大括号外部定义的变量就是全局变量
- 全局变量的使用范围更⼴,整个工程中想使用,都是有办法使用的。
- 局部变量:在大括号内部定义的变量就是局部变量
- 局部变量的使用范围是比较局限,只能在自己所在的局部范围内使用的。
示例:
#include <stdio.h>
int global = 2023;//全局变量
int main()
{
int local = 2018;//局部变量
printf("%d\n", local);
printf("%d\n", global);
return 0;
}
如果局部和全局变量,名字相同呢?
#include <stdio.h>
int n = 1000;
int main()
{
int n = 10;
printf("%d\n",n);//打印的结果是多少呢?
return 0;
}
![](https://img-blog.csdnimg.cn/direct/49ef821638a14e15921dd31ddbc739ff.png)
3.全局变量和局部变量在内存中存储在哪里呢?
⼀般我们在学习C/C++语言的时候,我们会关注内存中的三个区域:栈区、堆区、静态区。
- 局部变量是放在内存的栈区
- 全局变量是放在内存的静态区
- 堆区是用来动态内存管理的(后期会介绍)
其实内存区域的划分会更加细致,以后在操作系 统的相关知识的时候会介绍
5. 算术操作符:+、-、*、/、%
1. + 和 -
#include <stdio.h>
int main()
{
int x = 4 + 22;
int y = 61 - 23;
printf("%d\n", x);
printf("%d\n", y);
return 0;
}
运行结果:
2. *
#include <stdio.h>
int main()
{
int num = 5;
printf("%d\n", num * num); // 输出 25
return 0;
}
运行结果:
3. /
3.1. 除号的两端如果是整数,执行的是整数除法,得到的结果也是整数。
#include <stdio.h>
int main()
{
float x = 6 / 4;
int y = 6 / 4;
printf("%f\n", x); // 输出 1.000000
printf("%d\n", y); // 输出 1
return 0;
}
运行结果:
3.2. 如果希望得到浮点数的结果,两个运算数必须⾄少有⼀个浮点数,这时 C 语⾔就会进⾏浮点数除法。
#include <stdio.h>
int main()
{
float x = 6.0 / 4; // 或者写成 6 / 4.0
printf("%f\n", x); // 输出 1.500000
return 0;
}
#include <stdio.h>
int main()
{
int score = 5;
score = (score / 20) * 100;
printf("%d",score);
return 0;
}
自己试着计算一下,得出结果看与下面的结果是否一样。
运行结果:
#include <stdio.h>
int main()
{
int score = 5;
score = (score / 20.0) * 100;
printf("%d",score);
return 0;
}
用浮点数,结果就是 25.
4.%
#include <stdio.h>
int main()
{
int x = 6 % 4; // 2
printf("%d",x);
return 0;
}
他的余数为 2,所以输出结果为 2.
#include <stdio.h>
int main()
{
printf("%d\n", 11 % -5); // 1
printf("%d\n",-11 % -5); // -1
printf("%d\n",-11 % 5); // -1
return 0;
}
运行结果:
看到结果是否与你计算的一样呢? 第一个输出结果为正数,而第二三个输出结果为负数。由上述可得出结论 正负号由第⼀个运算数的正负号决定。
6. 赋值操作符:=和复合赋值
int a = 100;//初始化
a = 200;//赋值,这⾥使⽤的就是赋值操作符
1. 连续赋值
int a = 3;
int b = 5;
int c = 0;
c = b = a+3;//连续赋值,从右向左依次赋值的。
int a = 3;
int b = 5;
int c = 0;
b = a+3;
c = b;
2. 复合赋值符
int a = 10;
a = a+3;
a = a-2;
int a = 10;
a += 3;
a -= 2;
运行结果:
+= -=*= /= %=// 下⾯的操作符后期讲解>>= <<=&= |= ^=
7. 单目操作符:++、--、+、-
1. ++和--
1.前置++
int a = 10;
int b = ++a; //++的操作数是a,是放在a的前⾯的,就是前置++
printf("a=%d b=%d\n",a , b);
int a = 10;
a = a+1;
b = a;
printf("a=%d b=%d\n",a , b);
2. 后置++
int a = 10;
int b = a++; //++的操作数是a,是放在a的后⾯的,就是后置++
printf("a=%d b=%d\n",a , b);
int a = 10;
int b = a;
a = a+1;
printf("a=%d b=%d\n",a , b);
3. 前置--
int a = 10;
int b = --a;//--的操作数是a,是放在a的前⾯的,就是前置--
printf("a=%d b=%d\n",a , b);//输出的结果是:9 9
4. 后置--
计算口诀:先使用,后-1
int a = 10;
int b = a--;//--的操作数是a,是放在a的后⾯的,就是后置--
printf("a=%d b=%d\n",a , b);//输出的结果是:9 10
2. + 和 -
int a = +10; 等价于 int a = 10;
int a = 10;
int b = -a;
int c = -10;
printf("b=%d c=%d\n", b, c);//这⾥的b和c都是-10
int a = -10;
int b = -a;
printf("b=%d\n", b); //这⾥的b是10
3. 错误示例
在学校学习和平时练习中不要使用以下代码。
#include<stdio.h>
int main()
{
int a = 1;
int b = (++a) + (++a) + (++a);
printf("%d\n", b);
return 0;
}
这个代码是错误的。不能 int b = (++a) + (++a) + (++a);
这样写,他在不同的编译器输出的结果完全不同。
在VS2022中:
在devC++中:
8. 强制类型转换
(类型)
请看代码:
int a = 3.14;
//a的是int类型, 3.14是double类型,两边的类型不⼀致,编译器会报警告
为了消除这个警告,我们可以使用强制类型转换:
int a = (int)3.14;//意思是将3.14强制类型转换为int类型,这种强制类型转换只取整数部分
9. scanf 和 printf 介绍
1. printf
1. 基本用法
#include <stdio.h>
int main()
{
printf("Hello World");
return 0;
}
#include <stdio.h>
int main()
{
printf("Hello World\n");
return 0;
}
如果文本内部有换行,也是通过插入换行符来实现,如下方代码:
#include <stdio.h>
int main()
{
printf("Hello\nWorld\n");
printf("Hello\n");
printf("World\n");
return 0;
}
运行结果:
2. 占位符
#include <stdio.h>
int main()
{
printf("There are %d apples\n", 3);
return 0;
}
运行结果为:
常用的占位符除了 %d ,还有 %s 表示代入的是字符串。
#include <stdio.h>
int main()
{
printf("%s will come tonight\n", "zhangsan");
return 0;
}
#include <stdio.h>
int main()
{
printf("%s says it is %d o'clock\n", "lisi", 21);
return 0;
}
#include<stdio.h>
int main()
{
int a = 10;
printf("a = %d", a);
return 0;
}
运行的结果为:
3.占位符列举
%a :⼗六进制浮点数,字⺟输出为⼩写。%A :⼗六进制浮点数,字⺟输出为⼤写。%c :字符。%d :⼗进制整数。// int%e :使⽤科学计数法的浮点数,指数部分的 e 为⼩写。%E :使⽤科学计数法的浮点数,指数部分的 E 为⼤写。%i :整数,基本等同于 %d 。%f :⼩数(包含 float 类型和 double 类型)。//float %f double - %lf%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 类型。%% :输出⼀个百分号。
C++相关内容(包含占位符)链接:
https://www.cplusplus.com/https://www.cplusplus.com/
4.输出格式
5. 限定宽度
#include <stdio.h>
int main()
{
printf("%5d\n", 123); // 输出为 " 123"
return 0;
}
![](https://img-blog.csdnimg.cn/direct/1cdb56b508384bd0b554f2bd6ced23ff.png)
#include <stdio.h>
int main()
{
printf("%-5d\n", 123); // 输出为 "123 "
return 0;
}
// 输出 " 123.450000"
#include <stdio.h>
int main()
{
printf("%12f\n", 123.45);
return 0;
}
6. 总是显示正负号
#include <stdio.h>
int main()
{
printf("%+d\n", 12); // 输出 +12
printf("%+d\n", -12); // 输出 -12
return 0;
}
7. 限定小数位数
// 输出 Number is 0.50
#include <stdio.h>
int main()
{
printf("Number is %.2f\n", 0.5);
return 0;
}
![](https://img-blog.csdnimg.cn/direct/e85cfb4deb314ab3bb0bf435187a495d.png)
// 输出为 " 0.50"
#include <stdio.h>
int main()
{
printf("%6.2f\n", 0.5);
return 0;
}
![](https://img-blog.csdnimg.cn/direct/6eb651049f0346fe8d16a3a79b0bbedb.png)
最小宽度和小数位数这两个限定值,都可以用 * 代替,通过 printf() 的参数传入。
#include <stdio.h>
int main()
{
printf("%*.*f\n", 6, 2, 0.5);
return 0;
}
// 等同于printf("%6.2f\n", 0.5);
8. 输出部分字符串
// 输出 hello
#include <stdio.h>
int main()
{
printf("%.5s\n", "hello world");
return 0;
}
2. scanf
#include <stdio.h>
int main()
{
int score = 0;
printf("请输⼊成绩:");
scanf("%d", &score);
printf("成绩是:%d\n", score);
return 0;
}
运行结果为:
图画演示:
scanf() 函数用于读取用户的键盘输入。程序运行到这个语句时,会停下来,等待用户从键盘输⼊。用户输⼊数据、按下回车键后, scanf() 就会处理用户的输入,将其存入变量。它的原型定义在头文件 stdio.h 。
1. 基本用法
scanf("%d", &i);
注意 :变量前⾯必须加上 & 运算符(指针变量除外),因为 scanf() 传递的不是值,⽽是地址,即将变量 i 的地址指向⽤⼾输⼊的值。如果这⾥的变量是 指针变量 (⽐如字符串变量),那 就不⽤加 & 运算符。
下⾯是⼀次将键盘输⼊读⼊多个变量的例子。
scanf("%d%d%f%f", &i, &j, &x, &y);
![](https://img-blog.csdnimg.cn/direct/16eddfea3eb34131b62d89e65ca857bb.png)
![](https://img-blog.csdnimg.cn/direct/05e8b28f9a23428fa6a1e8289c4b8ee7.png)
#include <stdio.h>
int main()
{
int x;
float y;
// ⽤⼾输⼊ " -13.45e12# 0"
scanf("%d", &x);
printf("%d\n", x);
scanf("%f", &y);
printf("%f\n", y);
return 0;
}
![](https://img-blog.csdnimg.cn/direct/f5000ed7e6cf411c9348697c23821e0c.png)
#include <stdio.h>
int main()
{
int x;
float y;
// ⽤⼾输⼊ " -13.45e12# 0"
scanf("%d%f", &x, &y);
return 0;
}
2. scanf的返回值
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
float f = 0.0f;
int ret = scanf("%d %d %f", &a, &b, &f);
printf("a=%d b=%d f=%f\n", a, b, f);
printf("ret = %d\n", ret);
return 0;
}
运行结果为:
通过令 int ret = scanf("); 的形式,输出内容。可以知道正确读取了几个数值。
通常会使用 scanf 的返回值,来判断是否是读取正确。
![](https://img-blog.csdnimg.cn/direct/d4dcc2ae3252448c8ba08a8aa2905b58.png)
3. 占位符
%c :字符。%d :整数。%f : float 类型浮点数。%lf : double 类型浮点数。%Lf : long double 类型浮点数。%s :字符串。%[] :在⽅括号中指定⼀组匹配的字符(⽐如 %[0-9] ),遇到不在集合之中的字符,匹配将会停止。
#include <stdio.h>
int main()
{
char name[11];
scanf("%10s", name);
return 0;
}
![](https://img-blog.csdnimg.cn/direct/01dbce6963e04f579b3ddb2afd03d13e.png)
4. 赋值忽略符
#include <stdio.h>
int main()
{
int year = 0;
int month = 0;
int day = 0;
scanf("%d-%d-%d", &year, &month, &day);
printf("%d %d %d\n", year, month, day);
return 0;
}
#include <stdio.h>
int main()
{
int year = 0;
int month = 0;
int day = 0;
scanf("%d%*c%d%*c%d", &year, &month, &day);
return 0;
}
![](https://img-blog.csdnimg.cn/direct/ce940de6452b491eae27bb9220bcde95.png)
注意:
scanf("%d,%d",&a,&b);
![](https://img-blog.csdnimg.cn/direct/c9a84898dc3347bd9f1ce1b7686f3aa7.png)
今天的学习到此结束。欢迎大家进行讨论,提出问题。
明天会发一份关于VS2022中设置 #define _CRT_SECURE_NO_WARNINGS 1 的标题,用来使
scanf 在VS2022中正常运行。
让我们共同进步,互相学习,向着目标前行。