运算符的概念以及分类
1.运算符基本概念
- 运算符是告诉编译程序执行特定算术或逻辑操作的符号。
+ 例如告诉程序, 某两个数相加, 相减等
2.运算符分类
按照功能划分:
- 算术运算符
- 关系运算符与逻辑运算符
- 按位运算符
运算符根据参与运算的操作数的个数分为
- 单目运算
- 单目运算:只有一个操作数 如 : i++ ! sizeof
- 双目运算
- 双目运算:有两个操作数 如 : a+b
- 三目运算
- 三目预算:C语言中唯一的一个,也称为问号表达式 a>b ? 1 : 0
- 单目运算
运算符的优先级以及结合性
本小节知识点:
- 【理解】优先级
- 【理解】结合性
1.优先级
C语言中,运算符的运算优先级共分为15 级。1 级最高,15 级最低。 在表达式中,优先级较高的先于优先级较低的进行运算。而在一个运算量两侧的运算符优先级相同时,则按运算符的 结合性所规定的结合方向处理。
江哥提示:一般情况下不需要死记硬背优先级, 只需要记住()优先级最高即可
2.结合性
- C语言中各运算符的结合性分为两种,即左结合性(自左至右)和右结合性(自右至左)。
- 算术运算符的结合性是自左至右,即先左后右。
~~
~~ 例如表达式: x-y+z
~~ 则y 应先与“-”号结合,执行 x-y 运算,然后再执行+z 的运算。这种自左至右的结合 方向就称为“左结合性”。
~~
” + 而自右至左 的结合方向称为“右结合性”。
~~
~~ 最典型的右结合 性运算符是赋值运算符例如:如x=y=z
~~ 由于“=”的 右结合性,应先执行y=z 再执行x=(y=z)运算。
~~
算术运算符
本小节知识点:
- 【理解】算术运算符
- 【掌握】结合性和优先级
- 【掌握】算术运算的注意点
1.算术运算符
名称 | 符号 | 说明 |
---|---|---|
加法运算符 | + | 双目运算符,即应有两个量参与加法运算。如a+b,4+8等。具有左结合性。 |
减法运算符 | - | 双目运算符。但“-”也可作负值运算符,此时为单目运算,如-x,-5等具有左结合 性。 |
乘法运算符 | * | 双目运算符,具有左结合性。 |
除法运算符 | / | 双目运算符,具有左结合性。参与运算量均为整型时,结果也为整型,舍去小数。如果运算量中有一个是实型,则结果为双精度实型 |
求余运算符 (模运算符) | % | 双目运算符,具有左结合性。要求参与运算的量均为整型,不能应用于float或double 类型。求余运算的结果等于两数相除后的余数,整除时结果为0。 |
- 整数除于整数,求出来的结果依然是整数
- 浮点型赋值给整型会损失小数部分
- %两侧必须都为整数
- 利用%求出来的余数是正数还是负数,由%左边的被除数决定,被除数是正数,余数就是正数,反之则反
2.结合性和优先级
- 结合性:从左到右
- 优先级:
- * / % 优先级 大于 + -
- 优先级相同则左结合计算
3*5/3+18
先算3*5
然后再算除3
最后结果再+18
3.算术运算的注意点
- 1.自动类型转换
int a = 10.6;
int b = 10.5 + 1.7;
- 2.自动将大类型转换为了小类型,会丢失精度
自动类型提升
int b = 10.5 + 10;
- 3.将右边的1提升为了double类型
double b = 1.0 / 2;
解决除法的精度问题
- 4.强制类型转换
double a = (double)1 / 2;
double b = (double)(1 / 2);// 错误写法
- 在计算过程中,参与运算的操作数不是同一类型,那么系统会自动将小类型转换为大类型。然后再进行转换
求余运算符
- 【理解】求余运算注意事项
1.求余运算注意事项
- 参与运算的必须是整数
10 % 2 = 0
因为 10 可以被2整除, 没有余数
10 % 3 = 1
因为 10除以3余1, 所以结果为1
- 错误写法
12.3 % 3
- 注意
m%n 求余,相当于m/n 获取余数
- (1)n等于0 无意义
- (2)m等于0 结果为0
- (3)m>n 正常求余 如:8 % 3 = 2
- (4)m
10 % 3 = 1
-10 % 3 = -1
10 % -3 = 1
赋值运算符
本小节知识点:
- 【掌握】赋值运算符
- 【理解】赋值表达式及赋值语句
1.赋值运算符
+ 简单赋值运算符: =
+ 复合赋值运算符: +=、-=、*=、/=、%=
2.赋值表达式
什么是表达式?
- 将同类型的数据(如常量、变量、函数等),用运算符号按一定的规则连接起来的、有意义 的式子称为表达式。
- 例如:算术表达式、逻辑表达式、字符表达式等。
表达式的特点:
+ 表达式是一个意义的式子,所以一定有返回值
赋值表达式
- 由“=”连接的式子称为赋值表达式。
- 例如: x = a + b;
- 例如: x = a + b;
- 等号=左边只能是变量,不能是常量,下面的写法是错误的:10 = 10 + 5;
- 由“=”连接的式子称为赋值表达式。
- 凡是表达式可以出现的地方均可出现赋值表达式
赋值运算符的结合性
- 赋值运算符具有右结合性, 而且优先级比算术运算符低
- 例如: int a = 3 + 5; 会先计算3 + 5, 然后再把结果赋值给a
- 例如: int a = b = c = 5; 右结合性可理解为a=(b=(c=5))
- 赋值运算符具有右结合性, 而且优先级比算术运算符低
复合运算符
本小节知识点:
- 【理解】复合赋值运算符
1.复合赋值运算符
- 在赋值符“=”之前加上其它二目运算符可构成复合赋值符。
- /= 除后赋值 变量/=表达式 如:a/=3;即a=a/3
- *= 乘后赋值 变量*=表达式 如:a*=3;即a=a*3
- %= 取模后赋值 变量%=表达式 如:a%=3;即a=a%3
- += 加后赋值 变量+=表达式 如:a+=3;即a=a+3
- -= 减后赋值 变量-=表达式 如:a-=3;即a=a-3
构成复合赋值表达式的一般形式为: 变量 双目运算符 = 表达式; 如: a *= 1 + 2; 它等效于 变量 = 变量 双目运算符 表达式; 如: a = (1 + 2) * a;
- 注意:赋值运算符优先级排名14位,仅仅高于“,”运算符。
自增运算符
本小节知识点:
- 【了解】自增、自减运算符介绍
- 【掌握】自增、自减运算符求值过程
- 【了解】练习
1.自增、自减运算符介绍
- 在程序设计中,经常遇到“i=i+1”和“i=i-1”这两种极为常用的操作。C语言为这种操作��供了两个更为简洁的运算符,即++和–,分别叫做自增运算符和自减运算符。它们是单目运算符,是从右向左结合的算术运算符。
2.自增、自减运算符求值过程
前缀表达式:++x, –x;其中x表示变量名,先完成变量的自增自减1运算,再用x的值作为表达式的值;即
“先变后用”
,也就是变量的值先变,再用变量的值参与运算。后缀表达式:x++, x–;先用x的当前值作为表达式的值,再进行自增自减1运算。即
“先用后变”
,也就是先用变量的值参与运算,变量的值再进行自增自减变化。
int num = 3 ++a a++ 表达式值 4 3 变量num值 4 4 + a++ 或者 ++a 都是表达式, 表达式是有返回值的
+ 表达式的值和变量的值不是一回事
+ a++ 或者 ++a表达式的值就是变量a的值int b; int a = 10; b = ++a;//如果++在前代表先自增再参与其它运算 // a = a + 1; b = a; // a = 11 b = 11
int b; int a = 10; b = a++;//如果++在后代表先参与其它运算再自增 // b = a; a = a + 1; // a = 11 b = 10
- 练习
i=1; i++; j = i++ ; j =++i ; j = i--;
- 注意
自增、自减运算只能用于单个变量,只要是标准类型的变量,不管是整型、实型,还是字符型变量等,但不能用于表达式或常量。如:++(a+b), 与5++, const int N=0; N++; 等都是错误 的。 而i+++j++、++i+(++j)、++a+b++、++array[--j]等,这些都是合法的。
3.练习
int i = 5, j = 5, p, q; // 5 6 7 p=i++ + i++ + i++; // p = (i++) + (i++) + (i++) // 6 7 8 q = ++j + ++j+ ++j;// q = (++j) + (++j) + (++j) printf("%d,%d,%d,%d",p,q,i,j); 输出: 18,21,8,8 注意: ++, -- 优先级是2级(较高) ++, -- 结合性是右结合性
sizeof运算符
sizeof可以用来计算一个变量或一个常量、一种数据类型所占的内存字节数,内存字节数与所处的设备环境 64/32位 有关
- 格式:用法:sizeof(常量/变量)
- sizeof不是一个函数,是一个运算符
- 如果使用sizeof计算,可以省略(),sizeof和变量之间以空格分开
int number = sizeof 20;
逗号运算符
本小节知识点:
- 【了解】基本概念用法
- 【理解】求值过程
3. 【了解】逗号运算符使用注意
1.基本概念用法
- 在C语言中逗号“,”也是一种运算符,称为逗号运算符。 其功能是把多个表达式连接起来组成一个表达式,称为逗号表达式。
- 一般形式形式:
表达式1,表达式2,… …,表达式n;
- 例如:
a=a+1,b=3*4;
- 一般形式形式:
2.求值过程
表达式1,表达式2,… …,表达式n;
- 逗号表达式的运算过程是:先算表达式1,再算表达式2,依次算到表达式n
- 整个逗号表达式的值是最后一个表达式的值b = (a=4, ++a, a * 7); // 1.先执行第一个表达式, 将4赋值给a // 2.再执行第二个表达式, 让a自增变为5 // 3.再执行第三个表达式, 5 * 7 // 4.最后将最后一个表达式的值作为"逗号表达式的值"返回赋值给b, 所以b等于35
3.逗号运算符使用注意
程序中使用逗号表达式,通常是要分别求逗号表达式内各表达式的值,并不一定要求整个逗号表达式的值。
并不是在所有出现逗号的地方都组成逗号表达式,如在变量说明中,函数参数表中逗号只是用 作各变量之间的间隔符。
关系运算符
本小节知识点:
- 【了解】为什么要学习关系运算符
- 【了解】C语言中的真假性
- 【掌握】关系运算符
1.为什么要学习关系运算符
默认情况下,我们在程序中写的每一句正确代码都会被执行。但很多时候,我们想在某个条件成立的情况下才执行某一段代码
这种情况的话可以使用条件语句来完成,但是学习条件语句之前,我们先来看一些更基础的知识:如何判断一个条件成不成立。
2.C语言中的真假性
- 在C语言中,条件成立称为“真”,条件不成立称为“假”,因此,判断条件是否成立,就是判断条件的“真假”。
- 怎么判断真假呢?C语言规定,任何数值都有真假性,任何非0值都为“真”,只有0才为“假”。也就是说,108、-18、4.5、-10.5等都是“真”,0则是“假”。
3.关系运算符
- 在程序中经常需要比较两个量的大小关系,以决定程序下一步的工作。比较两个量的运算符称为关系运算符。
序号 运算符 结合性 1 > 大于 如:a>b a>3 5>4 1>2 左结合 2 < 小于 如:a 左结合 3 =
大于等于 如: a>=1 d>=c 左结合 4 <= 小于等于 如: a<=0 i<=19 左结合 5 == 等于 i==3 a==b 左结合 6 != 不等于 a!=b c!=5 左结合 - 关系运算符的运算结果只有2种:如果条件成立,结果就为1,也就是“真”;如果条件不成立,结果就为0,也就是“假”。
int a = 4,b=10; int result = a>b; //0 result = a == b; //0 result = a<b; //1 result = a+b>b; //1
关系运算符优先级和结合性
本小节知识点:
- 【掌握】关系运算符结合性
- 【掌握】关系运算符优先级
1.关系运算符结合性
- 关系运算符都是双目运算符,其结合性均为左结合。
- 例如4>3>2:先算4>3,条件成立,结果为1。再与2比较,即1>2,条件不成立,结果为0。因此4>3>2的结果为0。
2.关系运算符优先级
关系运算符中==、!=的优先级相等,<、<=、>、>=的优先级相等,且前者的优先级低于后者
- 例如2==3>1:先算3>1,条件成立,结果为1。再计算2==1,条件不成立,结果为0。因此2==3>1的结果为0。
关系运算符的优先级小于算术运算符
- 例如3+4>8-2:先计算3+4,结果为7。再计算8-2,结果为6。最后计算7>6,条件成立,结果为1。因此3+4>8-2的结果为1。
-
3.练习
计算下列表达式的值 3 > 4 + 7 (3>4) + 7 5 != 4 + 2 * 7 > 3 == 10 写代码验证
逻辑运算符
本小节知识点:
- 【了解】逻辑运算符概念
- 【掌握】逻辑与
- 【掌握】逻辑或
- 【掌握】逻辑非
1.逻辑运算符概念
有时候,我们需要在多个条件同时成立的时候才能执行某段代码,比如:用户只有同时输入了QQ和密码,才能执行登录代码,如果只输入了QQ或者只输入了密码,就不能执行登录代码。这种情况下,我们就要借助于C语言提供的逻辑运算符。
C语言中��供了三种逻辑运算符:
- &&(与运算)
- ||(或运算)
- !(非运算)
- 逻辑运算的结果只有2个:“真”为1,“假”为0
2.逻辑与
格式:
- “条件A && 条件B”
运算结果:
- 只有当条件A和条件B都成立时,结果才为1,也就是“真”;其余情况的结果都为0,也就是“假”。因此,条件A或条件B只要有一个不成立,结果都为0,也就是“假”
- 口诀:一假则假
逻辑与运算过程
- 总是先判断条件A是否成立
- 如果条件A成立,接着再判断条件B是否成立:如果条件B成立,“条件A && 条件B”的结果就为1,即“真”,如果条件B不成立,结果就为0,即“假”
- 如果条件A不成立,就不会再去判断条件B是否成立:因为条件A已经不成立了,不管条件B如何,“条件A && 条件B”的结果肯定是0,也就是“假”
运算过程示例:
- 逻辑与的结合方向是“从左至右”。比如表达式 (a>3) && (a<5)
- 若a的值是4:先判断a>3,成立;再判断a<5,也成立。因此结果为1
- 若a的值是2:先判断a>3,不成立,停止判断。因此结果为0
- 因此,如果a的值在(3, 5)这个范围内,结果就为1;否则,结果就为0
使用注意
- 若想判断a的值是否在(3,5)范围内,千万不能写成
3<a<5
因为关系运算符的结合方向为“从左往右”。
- 例如a为2,它会先算3
- 若想判断a的值是否在(3,5)范围内,千万不能写成
3.逻辑或
格式:
- “条件A || 条件B”
运算结果:
- 当条件A或条件B只要有一个成立时(也包括条件A和条件B都成立),结果就为1,也就是“真”;只有当条件A和条件B都不成立时,结果才为0,也就是“假”。
- 口诀:一真为真
逻辑或运算过程
- 总是先判断条件A是否成立
- 如果条件A成立,就不会再去判断条件B是否成立:因为条件A已经成立了,不管条件B如何,“条件A || 条件B”的结果肯定是1,也就是“真”
- 如果条件A不成立,接着再判断条件B是否成立:如果条件B成立,“条件A||条件B”的结果就为1,即“真”,如果条件B不成立,结果就为0,即“假”
运算过程示例:
- 逻辑或的结合方向是“从左至右”。比如表达式 (a<3) || (a>5)
- 若a的值是4:先判断a<3,不成立;再判断a>5,也不成立。因此结果为0
- 若a的值是2:先判断a<3,成立,停止判断。因此结果为1
- 因此,如果a的值在(-∞, 3)或者(5, +∞)范围内,结果就为1;否则,结果就为0
使用注意
- C语言规定:任何非0值都为“真”,只有0才为“假”。因此逻辑或也适用于数值。比如 5 || 4的结果是1,为“真”;-6 || 0的结果是1,为“真”;0 || 0的结果是0,为“假”
4.逻辑非
格式:
- “! 条件A”
运算结果:
- 其实就是对条件A进行取反:若条件A成立,结果就为0,即“假”;若条件A不成立,结果就为1,即“真”。也就是说:真的变假,假的变真。
- 口诀:真变假,假变真
运算过程示例:
- 逻辑非的结合方向是“从右至左”。比如表达式 ! (a>5)
- 若a的值是6:先判断a>5,成立,再取反之后的结果为0
- 若a的值是2:先判断a>3,不成立,再取反之后的结果为1
- 因此,如果a的值大于5,结果就为0;否则,结果就为1
使用注意:
- 可以多次连续使用逻辑非运算符:!(4>2)结果为0,是“假”,!!(4>2)结果为1,是“真”,!!!(4>2)结果为0,是“假”
+C语言规定:任何非0值都为“真”,只有0才为“假”。因此,对非0值进行逻辑非!运算的结果都是0,对0值进行逻辑非!运算的结果为1。!5、!6.7、!-9的结果都为0,!0的结果为1
- 可以多次连续使用逻辑非运算符:!(4>2)结果为0,是“假”,!!(4>2)结果为1,是“真”,!!!(4>2)结果为0,是“假”
逻辑运算符结合性和优先级
本小节知识点:
- 【掌握】优先级
2. 【掌握】短路问题
1.优先级
!(非) // 注意 ↑ 算术运算符 ↑ 关系运算符 ↑ &&和|| // 注意 ↑ 赋值运算符
- 逻辑非优先级
int result = !0 + 1; printf("result = %d", result); 输出结果: 2 >先计算!0等于1 >然后再用计算结果加上1
- 算术运算符与逻辑运算符优先级
int result = 3 + 3 && 0 + 1; // (3 + 3) && (0 + 1); printf("result = %d", result); 输出结果: 1 >先计算3+3和0+1等到6和1 >然后6&&1
- 关系运算符与逻辑运算符优先级
int result = 3>5 || 2<4 && 6<1; // (3>5) || (2<4) && (6<1) // 0 || 1 && 0 // 1 && 0 printf("result = %d", result); 输出结果: 0 >先计算3>5,2<4,6<1得到结果0,1,0 >再进行逻辑运算0||1得到结果1 >再进行逻辑运算1&&0得到结果0
- 练习
3+2<5||6>3 4>3 && !-5>2
2.短路问题
- 与短路:&& 只要第一个条件表达为假那么后面的条件表达就不参与运算了
int a = 10; int b = 20; int result = (a > 19) && (b++ > 6); printf("a = %d,b = %d, result = %d\n", a, b, result); 输出结果:a = 10,b = 20, result = 0
- 或短路:|| 只要第一个条件表达式为真那么后面的条件表达式就不参与运算了
int a = 10; int b = 20; int result = (a > 19) || (b++ > 6); printf("a = %d,b = %d, result = %d\n", a, b, result); 输出结果:a = 10,b = 21, result = 1
三目运算符
本小节知识点:
- 【了解】条件运算符概念
- 【了解】注意点
3. 【了解】练习
1.条件运算符概念
条件运算符是C语言的唯一的三目运算符,即它需要3个数据或表达式构成条件表达式
格式:
- 表达式1?表达式2(结果A):表达式3(结果B)
求值规则:
- 如果表达式1为真,三目运算符的运算结果为表达式2的值(结果A),否则为表达式3的值(结果B)
示例: int a = 10; int b = 20; int max = (a > b) ? a : b; printf("max = %d", max); 输出结果: 20 等价于: int a = 10; int b = 20; int max = 0; if(a>b){ max=a; }else { max=b; } printf("max = %d", max);
2.注意点
- 条件运算符的运算优先级低于关系运算符和算术运算符,但高于赋值符。
例如: max=(a>b)? a:b; 可以去掉括号而写为: max=a>b?a:b;
条件运算符?和:是一对运算符,不能分开单独使用。
条件运算符的结合方向是从右至左
例如: a>b?a:c>d?c:d; 应理解为: a>b?a:(c>d?c:d)
3.练习
1.用户从键盘上输入三个整数,找出最大值,然后输入最大值 思路: //1、定义变量 num1,num2,num3,max //2、先比较 num1 和 num2,比较的结果存放到max //3、max和第三个数比较
选择结构-if练习
本小节知识点:
- 【理解】判断奇偶数
- 【理解】输出对应星期
- 【理解】输出对应季节
- 【理解】获取两个数最值
- 【理解】获取三个数最值
- 【理解】排序
1.判断奇偶数
- 从键盘输入一个整数,判断其是否是偶数,如果是偶数就输出YES,否则输出NO;
// 1.提示输入信息 printf("输入一个整数\n"); // 2.接收输入信息 int value; scanf("%d", &value); // 3.判断是否能被2整除 if (value%2 == 0) { // 输出偶数 printf("yes"); }else{ printf("no"); }
2.输出对应星期
- 接收用户输入的1~7的整数,根据用户输入的整数,输出对应的星期几
// 1.提示用户输入星期几 printf("请输入星期几(1~7)\n"); // 2.接收用户输入的星期数 int day; scanf("%d",&day); // 3.输出对应的星期 --》1.用屌丝做法 每天一个if --》2.用高帅富做法 if else if if(day == 1) { printf("星期1\n"); } else if(day == 2) { printf("星期2\n"); } else{ printf("地球不属于你\n"); }
3.输出对应季节
- 接收用户输入的一个整数month代表月份,根据月份输出对应的季节
// 1.提示用户输入月份 printf("请输入月份(\n"); // 2.接收用户输入的星期数 int month; scanf("%d",&month); // 3.输出对应的月份 if (month >=3 && month <=5) { printf("春季\n"); }else if (month >=6 && month <=8) { printf("夏季\n"); }else if (month >=9 && month <=11) { printf("秋季\n"); }else if(month == 12 || month == 1 || month == 2) { printf("春季\n"); }else { printf("地球不属于你\n"); }
if(month >12 || month <1){ printf("地球不属于你\n"); } else if(month >=3 && month <=5) { printf("春季\n"); } else if(month >=6 && month <=8) { printf("夏季\n"); } else if(month >=9 && month <=11) { printf("秋季\n"); } else { printf("冬季\n"); }
4.获取两个数最值
- 键盘输入两个整数,判断大小后输出较大的那个数
int num1, num2; printf("输入两个整数并用逗号隔开\n"); scanf("%d,%d", &num1, &num2); if (num1 > num2) { printf("%d\n",num1); }else{ printf("%d\n",num2); } printf("%d\n",num1 > num2 ? num1 : num2); 三元运算符好处:可以简化if else代码 弊端 :因为是一个运算符所以运算完必要要有一个结果。 简单用三元 复杂用if(阅读性好)
5.获取三个数最值
- 从键盘输入3个整数,判断大小后输出较大的那个数
- 方式1
int num1, num2, num3; printf("输入3个整数并用逗号隔开\n"); scanf("%d,%d,%d", &num1, &num2, &num3); // 方式1 int max; if (num1 > num2) { max = num1; }else{ max = num2; } if (max < num3) { max = num3; } printf("%d\n",max);
- 方式2
int max1 = num1 > num2 ? num1 : num2; int max = max1 > num3 ? max1 : num3; printf("%d\n",max);
- 方式3
if (num1 >= num2 && num1 >= num3) { printf("%d\n",num1); }else if (num2 >= num1 && num2 >= num3) { printf("%d\n",num2); }else if (num3 >= num1 && num3 >= num2) { printf("%d\n",num3); }
- 方式4(先写不省略括号)
if (number1 > number2) { // 代表number1当前最大 if (number1 > number3) { max = number1; // number1是最大 }else { max = number3; // number3是最大 } }else if (number2 > number3) // 因为if条件不满足, 所以此时此刻number2是最大的 { // 代表number2当前最大 max = number2; }else // 因为上面两个条件都不满足, 所以此时number3最大 { max = number3; } printf("max = %i\n", max);
6.排序
- 从键盘输入3个整数,排序后输出
- 方式1
int a, b, c; printf("输入3个整数并用逗号隔开\n"); scanf("%d,%d,%d", &a, &b, &c); // 方式1 写出所有方式 if (a >= b && b >=c) { printf("%d > %d > %d\n", a, b, c); }else if (a >= c && c >= b) { printf("%d > %d > %d\n", a, c, b); }else if (b >= a && a >= c) { printf("%d > %d > %d\n", b, a, c); }else if (b >= c && c >= a) { printf("%d > %d > %d\n", b, c, a); }else if (c >= a && a >= b) { printf("%d > %d > %d\n", c, a, b); }else if (c >= b && b >= a) { printf("%d > %d > %d\n", c, b, a); }
- 方式2
int a, b, c; printf("输入3个整数并用逗号隔开\n"); scanf("%d,%d,%d", &a, &b, &c); // 方式2(选择排序,画图讲解) int temp; if (a < b) { temp = a; a = b; b = temp; } if (a < c) { temp = a; a = c; c = temp; } if ( b < c) { temp = b; b = c; c = temp; } printf("%d > %d > %d\n", a, b, c);
选择结构-if注意点
本小节知识点:
- 【理解】if语句的使用注意点
1.if语句的使用注意点
- “;” 空语句
- if(条件) 可以直接写分号 “;” 表示什么也不干
if(10 > 2); { printf("10 > 2"); } 输出结果: 10 > 2
- 任何数值都有真假性
- if(1)、if(-1) 表示永真 if(0) 表示为永假
if (0) { printf("123\n"); }
- 判断变量与常量问题
- 但凡遇到比较一个变量等于或者不等于某一个常量的时候,把常量写在前面
// if(a = 0) // 错误写法, 但不会报错 if (0 == a) { printf("a的值是0\n"); }else{ printf("a的值不是0\n"); }
- 变量作用域问题
if (age > 10) { printf("已经懂事了\n"); int num = 1000; } printf("num = %d\n",num);
- 作用域混乱
- 想在if后面定义变量必须写{}
if (0) int a = 10; // 这句会报错 printf("a = %d\n", a);
- 省略大括号问题
- if else是一个整体, else匹配if的时候匹配离它最近的一个if
if(0) if(1) printf("A\n"); else printf("B\n"); else if (1) printf("C\n"); else printf("D\n");
类型转换问题
本小节知识点:
- 【掌握】算术运算中的类型转换
1.类型转换问题
类型转换分为:
- 隐式数据类型转换
- 显示数据类型转换
自动转换(隐式转换):
- 自动转换发生在不同数据类型的量混合运算时,由编译系统自动完成。
- 自动转换遵循以下规则:
- 相同数据类型的值才能进行运算(比如加法运算),而且运算结果依然是同一种数据类型。系统会自动对占用内存较少的类型做一个“自动类型提升”的操作
- 若参与运算量的类型不同,则先转换成同一类型,然后进行运算。
- 转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转 成long型后再进行运算。
- 所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成 double型,再作运算。
- char型和short型参与运算时,必须先转换成int型。
- 在赋值运算中,赋值号两边量的数据类型不同时,赋值号右边量的类型将转换为左边量的类型。如果右边量的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度,丢失的部分 按四舍五入向前舍入。
double ↑ long ↑ unsigned ↑ int ↑ char|short
例如: int i = 1; i = i + 8.808 printf("%d", i); 输出结果: 9 按照隐式处理方式,在处理i = i + 8.808时 首先i转换为double型,然后进行相加,结果为double 型,再将double型转换为整型赋给i
- 强制类型转换(显示转换):
- 强制类型转换是通过类型转换运算来实现的
- 其一般形式为:(类型说明符) (表达式)
(float) a; /* 把a转换为实型 */ (int)(x+y); /* 把x+y的结果转换为整型 */
int i = 1; i = i + (int)8.808 printf("%d", i); 输出结果: 9 这时直接将8.808转换成整型,然后与i相加,再把结果赋给i。 其实: 这样可把二次转换简化为一次转换。 int i = 1; i = (int)(i + 8.808) printf("%d", i); 或者让系统隐式转换 int i = 1; i = i + 8.808 printf("%d", i);
- 强制类型转换注意点
- 将大范围的数据赋值给小范围变量时,系统会自动做一个强制类型转换的操作,这样容易丢失精度
- 类型说明符和表达式都必须加括号(单个变量可以不加括号),如把(int)(x+y)写成(int)x+y则成了把x转换成int型之后再与y相加了。
- 无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类型。
float floatValue = 10.1f; int sum = 4 + (int)floatValue ; printf("sum = %d", sum);// 输出14 // floatValue本身的值并没有改变 printf("floatValue = %f", floatValue); // 输出10.100000
石头剪子布实现
本小节知识点:
- 【理解】应用:剪刀石头布游戏代码实现
#include <stdio.h> #include <stdlib.h> int main(int argc, const char * argv[]) { // 定义 0.剪刀 1.石头 2.布 // 1、定义变量 玩家和电脑 int player,computer=0; // 2、让电脑先出拳 //随机出拳 //如何进行随机出拳,借助一个stdlib.h下一个产生随机数的函数 // arc4random_uniform(n) 0~n-1之间的随机的整数 computer = arc4random_uniform(3); //0 1 2 //printf("%d\n",computer); // 3、用户出拳 printf("请出拳:0.剪刀 1.石头 2.布\n"); scanf("%d",&player); // 数据合法性的校验 if (player<0||player>2) { printf("非法的输入"); return 0; } // 4、判断比较 //先判断用户赢的情况 if((player==0&&computer==2)|| (player==1&&computer==0)|| (player==2&&computer==1)){ printf("我靠,你赢了!\n"); }else if((computer==0&&player==2)|| (computer==1&&player==0)|| (computer==2&&player==1)){ printf("很遗憾,你输了!\n"); }else{ printf("平局\n"); } return 0; }