文章目录
目录
前言
本文紧接上文的前置内容介绍,开始为大家介绍数据,变量,printf和scanf函数。
从这里开始就真正开始进入编程之路了。
赠言:千里之行,始于足下。祝愿我与大家的编程之路一帆风顺。
一、数据类型(内置)
C语言为大家提供了丰富的数据类型来描述数据,我们在创建变量时往往要先描述变量的数据类型。其中又可以分为内置类型和自定义类型,下面先为大家介绍一些内置类型
[ ]表示在使用时可以省略
signed表示有符号的,unsigned表示无符号的。(signed类型不是只能储存有符号的数据,无符号的数据也可以储存,而unsigned只能储存无符号的数据。但使用unsigned的好处是只储存无符号数据时,可以储存更多)
1.字符型
用来表示字符类型
char
[signed] char
unsigned char
2.整型
表示整数类型
短整型
short [int]
[signed] short [int]
unsigned short [int]
整型
int
[signed] int
unsigned int
长整型
long [int]
[signed] int
unsigned int
更长的整型
long long [int]
[signed] long long [int]
unsigned long long [int]
3.浮点型
表示小数类型
float
double //双精度浮点型
long double
4.布尔类型
表述真假,取值为:true或者false,使用时要包含头文件<stdbool.h>
_Bool
注:头文件中有这样的描述,即为了方便可以写为bool,而false的值实际上是0,true的值实际上是1。在C语言中,0表示假,非0表示真。
#define bool _Bool
#define false 0
#define ture 1
注:
int默认为signed int,但char却不一定,不同的开发环境下默认不一样。
二、变量
变量简而言之就是可以变化的值。与之相对的,不变的值成为常量
1.变量的创建
上述介绍数据类型的意义是,它可以用来创建变量。创建变量的语法是这样的
数据类型 + 变量名(起名规则参照标识符规则)
如
int age;
2.初始化
在创建变量时给一个初始值,这被成为初始化。创建变量时通常会进行初始化操作,因为这样可以明确变量的初始值。比如
int age = 10;
3.变量的分类
全局变量:在函数外部定义,作用范围是从定义处开始到程序文件的结尾。
局部变量:在大括号内部定义的变量,作用范围是从定义出开始到大括号的结尾。
若全局变量和局部变量的名字相同,那么在执行操作时会优先使用局部变量(前提是在局部变量的作用范围内),如下面的代码
#include <stdio.>
int age = 10;
int main()
{
int age = 20;
printf("%d",age);
return 0;
}
在这段代码会打印“age”的值,结果显示为20。
4.变量存储的位置
C语言中我们一般会关注内存的三个区域:栈区、堆区、静态区
全局变量放在静态区
局部变量放在栈区
三、数据类型的长度和sizeof操作符
每种数据类型都可以创建出长度不同的变量,变量长度不同,存储数据的范围不同。
1.sizeof操作符
sizeof是专门计算类型长度的操作符,单位是字节(等于8比特)
语法如下
sizeof(数据类型)
sizeof 表达式
sizeof 变量名字
//可以看到,计算表达式和变量名字时可以省略括号
注意:
1.sizeof后面的表达式不参与运算,输出的值只是数据类型的长度,并不会计算结果。 整型+整型还是整型,整型+浮点型变为浮点型。
(这是因为sizeof在编译期间就已经根据表达式的类型来确定长度了,而表达式的执行却 是在程序运行期间。)
2.sizeof返回值的类型为size_t类型,对应的占位符是%zd
2. 在VS2022环境下各数据类型的长度
单位:字节
| char | 1 |
| short | 2 |
| int | 4 |
| long | 4 |
| long long | 8 |
| float | 4 |
| double | 8 |
| long double | 8 |
| char | 1 |
可能有人要发出疑问:为什么int和long,double和long double是一样长的呢?
这是因为C语言规定后者只要大于等于前者就可以了,在不同的集成开发环境下可能不同。
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的最大值。
四、操作符
1.算数操作符
| 算术操作符 | 作用 |
| + | 完成加法 |
| - | 完成减法 |
| * | 完成乘法 |
| / | 完成除法 |
| % | 完成整数除法的求模(余数) |
注:1.像+,-这种有两个操作数(操作符两端的数)的操作符被称为双目操作符
2.对于/,若两端都是整数,则会执行整数除法,结果是整数,如20/100会算出0。
两端至少有一个是浮点数时,会执行浮点数除法。
3.%只可作用于整数,且结果(余数)的正负号由第一个运算数决定。
第一个运算数是正号,结果就是正号,同理负号。
2.赋值操作符
1.赋值与=
给创建好的变量一个值叫做赋值。=是一个可以随时给变量赋值的操作符。如
int a = 0;
int b = 3;
int c = 5;
a = 10; //赋值
c = b = a+5; //连续赋值,顺序从右往左
其中最后一行的操作称为连续赋值,顺序是从右往左。
虽然C语言支持连续赋值,但不建议这样做,因为不方便观察。而是拆成一个一个的算式。
2.复合赋值符
+= -=
*= /= %=
>>= <<=
&= |= ^=
这些操作符可以使变量完成自加自减等操作。
比如下面两端代码的意义是一样的
int a = 10;
a = a+2;
int a = 10;
a += 2;
3. 单目操作符:++,--,+(正),-(负)
1.++,--
++或--表示自加1或自减1, 和+=1或-=1的效果是一致的,但有前置和后置之分。下面以++举例说明
前置++:先+1,再使用
后置++:先使用,再+1
int a = 1;
int b = ++a; //a先自加1, 再赋值给b,所以b是2
int c = 1;
int d = a--; //c先赋值给d,再自加1,所以d是1
这使得两种++在赋值等操作时会产生不同的结果
2.+和-
这里是指正号和负号
正号可以省略,对于赋值没有影响。负号可以用来改变数值的正负号。
如在负数前加负号,改值变为整数
3. 强制类型转换
这是一种特殊的操作符,语法为(类型)
顾名思义,可以强制地转换数值的类型,不到万不得已请不要使用。
int a = (int)3.14;//这里强制将3.14转为了int类型
五、printf
printf包含于库文件<stdio/h>,在使用时要先声明,其余包含于库函数的函数也如此,在本系列中,后续将不会再重复说明。
1.作用
print表示打印,f表示format(格式),printf可以定制格式打印。
这里展示一段基本代码
#include <stdio.h>
int main()
{
printf("Hello world!\n");
return 0;
}
2.占位符
上文说到了printf支持定制格式。在定制格式时,可以使用占位符。
占位符的作用是让printf函数知道,这个位置将会被某一特定格式的值来植入。
语法和举例如下
#include <stdio.h>
int main()
{
printf("%d",3);
return 0;
}
这里的%d就是一种占位符,它会先占位,然后等待植入,后面的3就是植入的值,会代替掉%d,
可以如上面的代码般直接植入,也可以植入自己创建的变量,将上述“3”的位置用变量名代替即可。同时占位符可以有多个,会被后续的值从左到右依次替代,用逗号隔开即可。
由此可知,printf函数的参数和占位符有对应关系,有n个占位符,就会有n+1个参数,以上图为例“ ”中的打印内容是一个参数,3是一个参数
下面是一些常用的占位符
%a:十六进制浮点数,字母输出为小写。%A:十六进制浮点数,字母输出为大写。%c:字符。//char%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:十六进制整数。%%:输出一个百分号定制输出格式
3. 几种简单的定制输出格式
1.限定宽度
printf()允许限定占位符的最小宽度,在%后加上数字即可。比如
printf("%5d",123);
注:1.这里是定制打印宽度至少为5,123不足5位,会用空格补齐,默认右对齐。也就是说会在 123的左边补空格,输出为 123。
2.当长度超过限定的最小宽度时,会正常打印。因为限定的是最小宽度。
3.对于小数,限定的是所有数字的数目,即整数部分和小数部分都算。
4. 若想改成左对齐,则在数字前加-
2. 总是显示正负号
在百分号后加+即可。如
printf("%+d",123);//会打印+123
3.限定小数位数
输出小数时在百分号后加.n,其中n表示数字。这时只会打印n位小数。如
printf("%.2f",0.5); //会输出为0.50
这种输出可以与上面两种混用,如

4.输出部分字符串
%.ns表示输出前n个字符。如

六、scanf
scnaf用来从键盘向变量里输入值。
1.用法
int i;
int a;
scanf("%d,%d",&i,&a);
同样使用占位符,&是取地址符号,除指针变量(如字符串变量)外的变量前必须加上。
因为scanf()传递的不是值,而是地址。
同样,可以使用多个占位符,但在输入时,必须按照前面的格式输入,如例子中必须输入
数字,数字,不可以用不一样的符号隔开,如空格。
scanf()在处理数值的占位符时,会自动过滤空白字符(空格,指标符,占位符等),所以输入的数据中含有空格等也没关系。但%c是例外。如果非要跳过空白字符,可以在c前面加空格,写成% c。
scanf()的原理是:用户的输入会先放入缓存,当回车键按下后,scanf按照占位符对缓存进行解读。解读时,会从上一次解读遗留的第一个字符开始,直到缓存读完或是遇到第一个不符合条件的字符为止。
2.占位符
scanf常用的占位符如下
%c:字符。%d:整数。%f:float类型浮点数。%lf:double类型浮点数。%Lf:long double类型浮点数。%s:字符串。(注)%[]:在方括号中指定一组匹配的字符(比如%[0 - 9]),遇到不在集合之中的字符,匹配将会停止。
注:%s并不能简单地理解为字符串,它是从当前第一个非空白字符开始读起,直到遇到遇到空白字符为止。
3. scanf的返回值
scnaf()的返回值是一个整数,表示成功读取变量的个数。
若没有读取任何项,或者匹配失败,返回0;
若在成功读取到数据前,发生了读取错误或是读取到文件结尾,返回EOF(-1)
EOF是end of file的意思。
在VS中,想要返回EOF,需要输入三次crtl+z。
4.赋值忽略符 *
上文中提到scanf的输入必须和格式一致,但这样输入十分麻烦,所以可以使用赋值忽略符*
将赋值忽略符加在任何占位符的百分号后面,该占位符的值就不会返回,解析后就会被丢弃。
例如
scanf("%d%*c%d%*c%d",&a,&b,&c");
这样无论是输入1,2,3;还是1 2 3;或是1-2-3就都可以被读取了。
5.关于返回值被忽略和scanf_s
我们在VS使用scanf时,总会出现下面两个提示

1.关于返回值被忽略
这是因为我们只使用了scanf,但是却没有创建一个变量来存储scanf的返回值,我们只需要创建一个变量来存储它的值,或是直接忽视就好了。

2.关于scanf_s
图中第二个报错翻译过来大概就是scanf函数不安全,请考虑使用scnaf_s。
scnaf不安全的一个原因是,如果输入的数据过多,会造成数据丢失。
但仍不推荐使用scanf_s进行替代,这是因为scnaf_s是微软自己开发的函数,也就是说其他的开发环境是不存在的,这就使得程序的可移植性得到了极大的限制。
同样忽视即可。如果一直报错感觉很烦,还可以用下面这种方法。
#define _CRT_SECURE_NO_WARNINGS 1
在源文件的第一行添加如图所示的代码,VS就不会再提示了。其中数字1可以不加,也可以自己定义个别的数字。
如果觉得每次新建文件都要加还是麻烦,可以找到下图的文件

并在里面写入上面的代码。如果提示不具有权限,可以将该文件拖动到桌面,任何进行写入,保存后再拖回到原文件夹的位置。
这样每次创建新的源文件,都会自动在开头自动加上这段代码了。
这是因为VS在创建源文件时,实际上就是在拷贝这个文件。
同理,自己想加入其他的代码也可以。
结尾
在本文中作者按照自己的理解为大家简述了printf和scnaf的使用及前置知识,以及作者本人认为必须了解到的一些注意事项。希望可以帮助到大家。
1899

被折叠的 条评论
为什么被折叠?



