3.C语言基本运算
一. 算术运算
C语言一共有34种运算符,包括了常见的加减乘除运算
1. 加法运算 +
● 除开能做加法运算,还能表示正号: +5、+90
2. 减法运算 –
● 除开能做减法运算,还能表示负号:-10、-29
3. 乘法运算 *
● 注意符号, 不是x ,而是 *
4. 除法运算 /
● 注意符号,不是 ÷,也不是\, 而是/
● 参与运算的是什么类型,得出结果就是什么类型
例如:
整数除以整数,还是整数。 1/2的值是0,这个并不是二分之一
double c = 10/3 ; => 3.000 而不是 3.333
double c = 10.0/3 ; => 3.333
double c = (double)10/3 ; => 3.333
5. 取余运算 % (模运算)
● 什么是取余:两个整数相除以后的余数
● %两侧只能是整数
● 正负性取决于%左侧的数值
6. 注意点 (类型转换)
1) 自动类型转换
int b = 10.5 + 1.7; (double –) int , 编译正常通过,但有警告提示)
自动将大类型转换为小类型,会丢失精度
2) 强制类型转换
int a = (int)10.6; (强制类型转换,编译正常通过~并且无警告提示)
3) 自动类型提升
double c = 10.6 + 6;
● 表达式
● 结合性(结合方向): 2+3+4
● 优先级: 5+4*8-3
7. 习题
1) 当?是什么运算符时,不论整数变量a的值怎么变,结果c都不超过10
int c = a?10; => ? 为 %
2) 提示用户输入两个整数,并输出两个整数的平均值
3) 提示用户输入一个时间的秒数,比如500秒就输入500,然后输出对应的分钟和秒,比如500s就是8分钟20秒
#include <stdio.h>
int main()
{
// 1. 提数输入时间秒
printf("Please enter time(s): \n");
// 2. 接收用户输入的时间
int time1;
scanf("%d", &time1);
// 3. 转化成对应的分钟和秒
int minute = time1 / 60; // 分钟
int second = time1 % 60; // 秒
printf("%ds = %d minute %d second \n", time1, minute, second);
return 0;
}
二. 赋值运算
1. 简单赋值
● int a = 10 + 5; 的运算过程
● a = b = 10;
2. 复合赋值运算符
a += 5; => a = a + 5
a *= 5; => a = a * 5
a --; => a -= 1; => a = a - 1;
a ++; => a += 1; => a = a + 1;
++a;
a ++ 和 ++ a的区别:
案例1:
b = a++; => b =a; a=a+1;
案例2:
b = ++a; => a=a+1; b=a;
案例3
int b; int a =10;
b = (a++) + (++a);
a++后 => a =11; ++a => a=a+1 => a=11+1 =12
b = 10 + 12
案例4
int b; int a =10;
b = (++a) + (a++);
++a前 => a =a+1=11 ; a++前 => a=11
b = 11 +11
a++ = a+1 = 11+1 =12
案例5:报错
10++; => 10 = 10 + 1; 报错
三. sizeof
1. 作用
用来计算一个变量或者一个常量、一种数据类型所占用的内存字节数。
2. 基本形式
● sizeof (变量/常量)
● sizeof (变量/常量)
● sizeof (数据类型)
● 不能sizeof 数据类型
3. 测试案例
#include <stdio.h>
// sizeof 的用法
int main()
{
// 1、常量查看占用内存大小
// int size = sizeof(10);
// int size = sizeof 10.8;
// 2、变量查看占用内存大小
// int a =10;
// int size = sizeof(a);
// int size = sizeof a;
// 3、直接查看变量类型,占用内存大小
// int size = sizeof(float);
int size = sizeof(double);
printf("size = %d \n", size);
return 0;
}
四. 关系运算(比较运算)
1. 条件判断:
● 默认情况下,我们在程序中写的每一句正确代码都会被执行,但很多时候,我们想在某个条件成立的情况下才执行某一段代码
● 这种情况的话可以使用条件语句来完成,但是我们暂时不学习条件语句,先来看一些更基本的知识,如何判断一个条件成不成立。
2. 真假:
● 在C语言中,条件成立称为“真”,条件不成立称为“假”,因此,判断条件是否成立,就是判断条件的“真假”
● 怎么判断真假呢?C语言规定,任何数值都有真假性,任何非0值都为“真”,只有0才是“假”,也就是说:108,、-13、4.5、-10.5 等都是“真”,0则是“假”。
3. 关系比较:
开发中经常需要比较,比如斗地主游戏中牌的大小。利用关系运算符就可以比较2个只的大小
● 关系运算符的运算结果只有2种:
如果条件成立,结果就是1,也就是”真“;
如果条件不成立,结果就是0,也就是”假“。
4. 优先级:
● 关系运算符中:>、<、>=、<=、==、!=
关系运算符中==、!=、的优先级相等,<、<=、>、>=的优先级相等,却前者的优先级低于后者
例如: 2 = 3 > 1
● 关系运算符的结合方向为“从左到右”: 4>3>2
● 关系运算符的优先级小于算术运算符: 3+4 > 8-2
5. 习题:
计算下列表达式的值:
#include <stdio.h>
// 习题1:
// int a = 5 != 4 + 2 * 7 > 3 == 10;
int main()
{
int a = 5 != 4 + 2 * 7 > 3 == 10;
/*
分析如下:
int a = 5 != 4 + 2 * 7 > 3 == 10;
=>关系运算符的优先级 小于 算术运算符: 3+4 > 8-2
=>int a = 5 != (4+2*7) > 3 == 10;
=>int a = 5 != 18 > 3 == 10;
=>关系运算符中==、!=、的优先级相等,<、<=、>、>=的优先级相等,却前者的优先级低于后者
// 条件 成立 就返回1, 真
// 条件不成立就返回0, 假
=>int a = 5 != 1 == 10;
=>关系运算符的结合方向为“从左到右”: 4>3>2
=>int a = 1 == 10;
=>int a = 0;
*/
printf("a = %d \n", a);
return 0;
}
五. 逻辑运算
● 有时候,我们需要在多个条件同时成立才能执行某段代码。比如:用户只有同时输入了QQ号和密码,才能执行登录代码,如果只输入了QQ或者只输入了密码,就不能执行登录代码,这种情况下,我们就要借助于C语言提供的逻辑运算符
● 逻辑运算的结果只有2个,“真”为1,“假”为0。
1. && 逻辑与
1) 使用格式
“条件A && 条件B”
2) 运算结果
只有当条件A 和 条件B 都成立时,结果才是1,也就是“真”:其余情况的结果都为0,也就是“假”,因此,条件A或条件B只要一个不成立,结果都为0,也就是“假”。
3) 运算过程
总是先判断条件A是否成立
● 如果条件A成立,接着再判断条件B是否成立;如果条件B成立,“条件A && 条件B”的结果就为1,即“真”,如果条件B不成立,结果就为0,也就是“假”。
● 如果条件A不成立,就不需要判断条件B是否成立;因为条件A已经不成立了,不管条件B如何,“条件A && 条件B”的结果就为0,也就是“假”。
4) 举例
逻辑与 的结合方向是“自左至右”。比如表达式(a>3 && a<5)
● 若a的值是4,先判断a>3成立,再判断a<5,也成立,因此结果为1。
● 若a的值是2,先判断a>3不成立,停止判断,因此结果为0。
● 因此,如果a的值在(3~5)这个范围内,结果就为1;否则,结果就为0。
5) 注意
● 若想判断a的值是否在(3~5)范围内,千万不能写成3<a<5,因为关系运算符的结合方向为“从左往右”。比如a为2,它会先算3<a,也就是3<2,条件不成立,结果为0;再与5比较,即0<5,条件成立,结果为1。因此3<a<5的结果为1,条件成立,也就是当a的值为2时,a的值是在(3~5)范围内的,这明显是不对的,正确的判断方法是:(a>3)&&(a<5)
● C语言规定:任何非0的值都为“真”,只有0才能为“假”。因此逻辑与适用于数值。比如5&&4的结果是1,为“真”,-6&&0的结果是0,为”假”。
2. || 逻辑或
1) 使用格式
“条件A || 条件B”
2) 运算结果
当条件A或条件B只有一个成立时(也包括条件A和条件B都成立),结果就为1,也就是“真”;只有当条件A和条件B都不成立时,结果才为0,也就是“假”。
3) 运算过程
总是先判断条件A是否成立
● 如果条件A成立,就不需要判断条件B是否成立;如果条件A成立,不管条件B如何,“条件A || 条件B”的结果肯定为1,即“真”
● 如果条件A不成立,接下来判断条件B是否成立;因为条件B已经成立了,“条件A || 条件B”的结果肯定为1,即“真”,如果条件B也不成立了,结果就为0,也就是“假”。
4) 举例
逻辑或 的结合方向是“自左至右”。比如表达式(a<3 || a>5)
● 若a的值是4,:先判断a<3,不成立,再判断a>5,也不成立。因此结果为0。
● 若a的值是2,:先判断a<3,成立,停止判断。因此结果为1。
● 因此,如果a的值在(-∞,3)或者(5,+∞)范围内,结果就为1;否则,结果为0。
5) 注意:
C语言规定:任何非0值都为“真”,只有0才为“假”。因此逻辑或也适用于数值。
比如5 || 4的结果是1,为“真”; -6 || 0 的结果是1,为“真”; 0||0结果为0,为“假”
3. ! 逻辑非
如果条件成立,就返回0,如果条件不成立,就返回1
int a = !(10>8)
int a = !-10
1) 使用格式
“!条件A”
2) 运算结果
其实就是对条件A进行取反;若条件A成立,结果就为0,即“假”;若条件A不成立,结果就为1,即“真”。也就是,真的变假,假的变真。
3) 举例
逻辑非 的结合方向是“自右至左”。比如表达式: !(a>5)
● 若a的值是6:先判断a>5,成立。因此结果为0。
● 若a的值是2:先判断a>5,不成立。因此结果为1。
● 因此,如果a的值 > 5,结果就为0;否则,结果为1。
4) 注意:
● 可以多次联系使用逻辑非 运算符;!(4>2) 结果为0,是“假”;!!(4>2) 结果是1,是“真”;!!!(4>2)结果是0,是“假”。
● C语言规定: 任何非0值都为“真”,只有0才为“假”。因此,对非0值进行逻辑非! 运算的结果都是0,对0值进行逻辑非! 运算的结果为1、!5、!6、7、!9的结果都为0,!0的结果为1。
4. 运算符的优先级
六. 三目运算符
单目运算符: !5
双目运算符: 5>2
N目运算符 => 三目运算符:
(条件 ? 数值1 : 数值2)
条件成立,就返回数值1,否则返回数值2.
● int a = 5 ? 10 : 2;
● 获得a、b中的最大数
● 获得a、b、c中的最大数
#include <stdio.h>
// 习题1:
// 求出a、b、c中最大值
int main()
{
int a = 10;
int b = 300;
int c = 2000;
// int ab_max = a>b ? a : b;
// int Max = ab_max>c ? ab_max : c;
// 把 ab_max看做一个整体就行勒 (不过不推荐,因为不便于理解)
int Max = (a>b ? a : b) >c ? (a>b ? a : b) : c;
printf("Max = %d \n", Max);
return 0;
}