【C语言】C语言数据类型和变量(下)

5、算数操作符:+、-、*、/、%

在C语言编译代码中,必定会涉及到计算。
C语言为了方便运算,提供一系列操作符,算数操作符就是其中一组。分别是+、-、*、/、%。(操作符也称运算符,两者意思相同)

5.1 +和-

+和-算数操作符是用来完成加法和减法的。
+和-左右两边有两个操作数,故+和-这种操作符也叫做双目运算符
下面是代码使用演示:
在这里插入图片描述

5.2 *

运算符*用来完成乘法
示例如下:
在这里插入图片描述

5.3 /

运算符/用来完成除法。除号的两端是整数时,执行的是整除除法,得到的结果也是整数
在这里插入图片描述
上述代码示例中,尽管a的类型是float(浮点型),但是9 / 4得到的结果是2.000000,而不是2.250000.原因就在于C语言里面的整数除法是整除,即返回整数部分丢弃小数部分。(2.25丢弃0.25)

如果希望上述得到浮点数(小数)的结果,两个运算数(操作数)必须至少有一个是浮点数(小数)。这个时候C语言就会进行浮点数除法
请看下列示例:
在这里插入图片描述
上述示例中,9.0 /4(or 9 / 4.0)表示进行浮点数除法,得到的结果便是2.25

接下来我们再深入讨论一个运算代码:
在这里插入图片描述
上述代码中,如果我们以数学思维运算,我们很容易会算出num的结果是40,但是这个结果在C语言运算中是错误的。它的值却是等于0,这是因为num / 50是整除运算,得到的结果为0(10 / 50= 0.2去掉小数),当与200相乘时,0乘于任何数都为0;
在这里插入图片描述

为了想要得到我们数学运算中的结果,我们可以将num / 50转换成浮点数除法运算(即操作数至少一个转变成浮点数运算 50——>50.0):
在这里插入图片描述

5.4 %(求模运算)

运算符 %表示求模(余)运算,即返回两个整数相除的余数。这个运算符只能用于整数不能用于浮点数
请看下面代码演示:
在这里插入图片描述
负数求模的规则是,结果的正负号由第一个运算数的正负号决定。请看下面的代码对比:
在这里插入图片描述
根据上面的代码示例可以得出结论:17或-17决定了结果的正负号。

6.赋值操作符:=和复合赋值

在变量创建的时候给一个初始值叫做初始化,在变量创建好了之后,再给一个值,叫做赋值

int b = 500; //初始化
b = 900;  //赋值,这里使用的是赋值操作符

赋值操作符 = 是一个随时可以给变量赋值的操作符。

6.1连续赋值

赋值操作符也可以进行连续赋值

int b =8;
int e = 10;
int f =15;
f= e= b-5;  //连续赋值,从右向左依次赋值

在这里插入图片描述
C语言虽然支持这种连续赋值,但是写出的代码不容易理解,拆开来写可以方便观察代码的执行细节:
在这里插入图片描述

6.2复合赋值符

在写代码的时候,我们经常会遇到对一个数进行自增、自减的操作。
请看如下代码示例:
在这里插入图片描述
在C语言中对自加和自减提供更加简洁的书写方法:
在这里插入图片描述
C语言中提供了复合赋值符,方便编写代码,有如下符号:

+=   -=

*=   /=   %=

>>=   <<=

&=   |=   ^=

7.单目操作符:++、–、+、-

前面介绍的操作符都是双目操作符(即有两个操作数分布在操作符左右两边)。C语言中还有一些操作符只有一个操作数,称为单目操作符。++、–、+(正号)、-(负号)都是单目操作符。

7.1 ++和–

++是一种自增操作符,又分为前置++和后置++,–是一种自减操作符,也分为前置–和后置–。
在这里插入图片描述

7.1.1前置++

我们来看一下下列代码:

int s = 30;
int n = ++s;//++的操作数是s,是放在s的前面的,称为前置++。
printf("s=%d\n n=%d\n",s ,n);

它的运算结果是?
在这里插入图片描述
计算口诀:先+1,后使用。
s原来是30,先+1,s变成了31,再使用就是赋值给n,n得到的也是31,所以计算后,s和n都是31。相当于如下代码:
在这里插入图片描述

7.1.2后置++

我们根据以下代码引入来介绍后置++:

int m =15;
int n = m++;
printf("m =%d n=%d",m,n);

那这几行代码运行得到的数值是多少呢?

在这里插入图片描述
计算口诀:先使用,再+1。
m原来是15,先使用,就是先把m赋值给n,n得到了15,后+1,就是m+1变成了16,所以最终得到的结果就是m=16 n=15。相当于如下代码:
在这里插入图片描述

7.1.3 前置- -和后置- -

如果前面介绍的前置++和后置++理解了之后,那么前置- -和后置- -就只是把加1变成了减1。
计算口诀:前置- - 先-1,后使用(示例如下)
在这里插入图片描述
后置- - 先使用,后-1。(示例如下)
在这里插入图片描述

7.2 +和-

+:正号
-:负号 都是单目操作符
运算符+对正负值没有影响,可以完全省略,写了也不会报错。

int a = 5  //等价于 int a = +5。

运算符 - 用来改变一个值的正负号(取反),负数的前面加上 - 就会得到正数,正数的前面加上 - 就会得到负数

int m = 8;
int n = -m;
int o = -8;
printf("n=%d o=%d",n,o);

在这里插入图片描述

int m = -8;
int n = -m;
printf("n=%d",n);

在这里插入图片描述

8、强制类型转换

在操作符中还有一种特殊的操作符就是强制类型转换,语法形式如下:

(type name)
int a =15.92;
//a的类型是int,15.92是double类型,两边的类型不一致,编译器会报警告

在这里插入图片描述
为了消除warning,我们可以使用强制类型转换操作符:在这里插入图片描述
注意:我们使用强制类型转换都是没办法的时候使用,不需要强制类型转换能运行代码时尽量不要使用。

9、scanf和printf介绍

9.1printf介绍

printf()的作用是将参数文本输出到屏幕。
在这里插入图片描述
在这里插入图片描述
上面命令会在屏幕上输出一行文字”Welcome come to ChiaWei Lee Vlog,Wish you happy everyday.“。

printf()不会再行尾自动添加换行符,运行结束后,光标就停留在输出结束的地方,不会自动换行

为了让光标移动到下面一行的开头,可以在输出结尾文本添加一个换行符\n

printf()是在标准库的头文件stdio.h定义的。使用这个函数之前,必须在源码文件头部引入这个头文件。

占位符

printf()可以在输出文本中指定占位符
所谓的占位符,就是这个位置可以用其他值带入。
请看以下示例:

在这里插入图片描述
上面示例中,There are %d oranges是输出文本,里面的%d就是占位符,表示这个位置需要用其他值来替换,占位符的第一个字符都是%第二个字符表示占位符的类型,%d表示这里代入的值必须是一个整数。

printf()的第二个参数就是替换占位符的值,上面的65就是替换%d。执行输出后的结果就是:There are 65 oranges.

除了%d,还有%s也是常见的占位符,%s表示代入的是字符串
在这里插入图片描述

上面示例中,%s表示代入的是一个字符串,所以printf()的第二个参数就必须是字符串(ChiaWei)。执行后输出的就是 ChiaWei will have a better future。

输出文本里面可以使用多个占位符
在这里插入图片描述
上面示例中,输出文本%s says you got %d and pass the exam.有两个占位符,第一个是字符串占位符%s,第二个是整数占位符%d,分别对应printf()的第二个参数Wangkun(我的导师哈哈哈)和60(没好好复习被我导捞上来的,感谢他)。执行后输出的就是 Wangkun says you got 60 and pass the exam.(感觉好像句子时态写错了?没关系理解了用法就行)

总结:printf()参数占位符一一对应关系,如果有n个占位符,printf()的参数就应该有n+1个。如果参数个数少于对于的占位符,printf()可能会输出内存中的任意值

占位符列举

printf()的占位符有许多种类,与C语言的数据类型相对应。下面列出常用的占位符,以便往后查找:
• %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 :⼗六进制整数。(十六进制表示:0 1 2 3 4 5 6 7 8 9 a b c d e f)
%zdsize_t 类型
• %% :输出⼀个百分号。

输出格式

printf()可以定制占位符的输出格式。

限定宽度

printf()允许限定占位符的最小宽度
请看下面代码示例:
在这里插入图片描述
上述示例中,%9d表示这个占位符的宽度至少为9位。如果不满9位,对应的值前面会添加空格。输出的值默认是右对齐,即输出内容前面会有空格;如果想变成左对齐(空格补在后边),在输出内容后面可以添加空格,可以在占位符的%的后面插入一个 - 。
在这里插入图片描述

总是显示正负号

默认情况下,printf()不对正数显示+号,只对负数显示-号。如果想让正数也输入+号,可以在占位符的%后面加一个+。
在这里插入图片描述
上面示例中,%+d可以确保输出的数值,总是带有正负号

限定小数位数

输出小数时,有时候希望限定小数的位数。eg:希望小数点后面只保留两位,占位符可以写%.2f。
在这里插入图片描述
上面示例中,如果希望小数点后面输出2位(180.50),占位符就要写成%.2f。
可以与限定宽度占位符结合使用
在这里插入图片描述

最小宽度和小数位这两个限定值,可以用*代替(用法类似占位符),通过printf()的参数传入。
在这里插入图片描述

输出部分字符串

%s占位符用来输出字符串,默认是全部输出。如果只想要输出开头的部分,可以用%.[n]s指定输出的长度,其中[n]代表一个数字,表示所要输出的长度。
在这里插入图片描述

9.2 scanf

当有了变量,我们需要给变量输入值就可以使用scanf函数,如果需要将变量的值输出在屏幕上就可以使用printf函数。请看下面示例:
在这里插入图片描述
原理图演示:
在这里插入图片描述
注意:stdin(标准输入)一般是键盘,stdout(标准输出)一般是屏幕

9.2.1基本用法

scanf()函数用于读取用户的键盘输入。
程序运行到scanf函数时,会暂停下来等待用户输入信息
用户输入相应的信息按下回车(Enter)后,scanf()就会处理用户的输入,将其存入变量。
scanf函数的头文件与printf函数一样是stdio.h。语法也与printf函数相似。

scanf("%d",%a);

scanf函数的第一个参数是格式字符串,里面会放置占位符(与printf函数用法相似),告诉编译器如何解读用户的输入,需要提取的数据类型是什么?因为C语言的数据都是由类型的,scanf()必须提前知道用户输入的数据类型,才能处理数据。

它的其余参数存放用户输入的变量,格式字符串里面有多少个占位符,就有多少个变量。

分析上面的一行代码:scanf()的第一个参数%d,表示用户输入的数据类型是一个整数。%d就是一个占位符,%是占位符的标志,d表示整数。第二个参数&a(取地址a)表示,将用户从键盘输入的整数存入变量a。

注意:

  • 变量前面必须加上&(取地址符号,后面博客介绍)运算符(指针变量除外),因为scanf()传递的不是值,而是地址,即将变量a的地址指向用户输入的值。(后续指针博客详细介绍)
  • 如果这里的变量是指针变量(比如字符串变量),那么就不用加&运算符。
    下面展示一次将键盘输入读入多个变量的示例
#include <stdio.h>
int main()
{
int a = 0;
int b = 0;
float c = 0;
double n = 0;
scanf("%d%d%f%lf",&a,&b,&c,&n);
return 0;
}

上述示例中,字符串%d%d%f%lf,表示用户输入的前两个是整数,后两个是浮点数(包括双精度浮点数)。eg:8 12 0.3 9.8769

scanf()处理数值占位符时,会自动过滤空白字符,包括空格、制表符、换行符等。故用户在输入数值 的时候,有一个或者多个空格不影响scanf()解读数据。另外,用户使用回车键,将输入分成几行也不影响解读。
在这里插入图片描述

  • scanf()处理用户输入的原理:用户输入先存放缓存,等按下回车键后,按照占位符对缓存进行解读。
  • 解读用户输入时,会从上一次解读遗留的第一个字符开始,直到读完缓存,或者遇到一个不符合条件的字符为止。

请看下面示例:
在这里插入图片描述

上面示例中,scanf()读取用户输入时,%d占位符会忽略起首的空格,从3处开始读取数据,读取到3停下来,因为后面的 .不属于整数的有效字符。故占位符%d会读到3.
第二次调用scanf()时,就会从上一次停止解读的地方,继续往下读取。故从 .开始读取,由于对应的占位符是%f,就会读到.1415e3,这是采用科学计数法的浮点数格式。后面的#%#&*不属于浮点数 的有效字符,所以会停在这里。

当scanf()可以连续处理多个占位符,所以以上的例子可以写成如下形式:
在这里插入图片描述

9.2.2scanf函数的返回值

scanf()的返回值是一个整数,表示成功读取的变量个数

  • 如果没有读取任何项,或者匹配失败,则返回0
  • 如果在成功读取任何数据之前,发生了读取错误或者遇到读取到文件结尾,则返回常量EOF(-1)。
  • EOF——end of file文件结束标志
    请看下面示例:
    在这里插入图片描述
    如果输入前两个数后,按ctrl+z,则提前结束输入:
    在这里插入图片描述
    在VS2022(Visual Stdio 2022)环境中按3次ctrl+z,才结束输入,我们可以看到n的数值是2,表示正确读取了2个数值。

如果一个数字都不输入,直接按三次ctrl+z,输出的n是-1,也就是EOF。
在这里插入图片描述

9.2.3 占位符

scanf()常用的占位符如下:

  • %c:字符。
  • %d:整数。
  • %f:float类型浮点数。
  • %lf:double类型浮点数。
  • %Lf:long double 类型浮点数。
  • %s:字符串。
  • %[ ]:在方括号中指定一组匹配的字符(eg:%[0-9]),遇到不在集合之中的字符,匹配将会停止。

上述所列的占位符中,除了%c(字符占位符)以外,都会自动忽略起首的空白字符。%c不忽略空白字符,总是返回当前第一个字符,无论该字符是否为空格。
如果要强制跳过字符前的空白字符,可以写成scanf(" %c",&s),即%c前加上一个空格,表示跳过零个或多个空白字符。

  • %s不能简单等同于字符串。它的规则是:从当前第一个非空白字符开始读起,直到遇到空白字符(即空格、换行符、制表符等)为止
  • 所以%s不适合读取可能包含空格的字符串。另外,scanf()遇到%s占位符,会在字符串变量末尾存储一个空字符\0。
  • scanf()将字符串读入字符数组时,不会检测字符串是否超过了数组长度。所以储存字符串时,很可能会超过数组的边界,导致意想不到的结果。为了防止这种情况,使用%s占位符时,应该指定读入字符串的最长长度,即写成%[m]s,其中[m]是一个整数,表示读取字符串的最大长度,后面的字符将被丢弃(请看以下示例)
    在这里插入图片描述
    以上示例中,name是一个长度为20的字符数组,scanf()的占位符%15s表示最多读取用户输入的15个字符,后面的字符将被丢弃,这样就不会有数组溢出的风险了。
9.2.4赋值忽略符

有时候,用户的输入可能不符合预定的格式。(看如下示例)
在这里插入图片描述
正确的输入格式
当输入其他不恰当的格式时,scanf()读取就会失败:
在这里插入图片描述
为了避免这种情况,scanf()提供了一个赋值忽略符*,只要把*加在任何占位符百分号后面,该占位符就不会返回值,解析后就被丢弃。
在这里插入图片描述
在这里插入图片描述

%*c就是在占位符百分号后面,加入赋值忽略符表示这个占位符没有对应的变量,解读后不必返回。

  • 在创建变量的时候,给变量一个初始值是一种好的编程习惯,如果不给变量初始化,有的编译器会报错。
  • 局部变量不初始化的时候,它的值是随机的
  • 全局变量如果不初始化的,默认值是0;

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值