算术运算符
1.算术运算符
运算符 术语 示例 结果 + 正号 +3 3 - 负号 -3 -3 + 加 10 + 5 15 - 减 10 - 5 5 * 乘 10 * 5 50 / 除 10 / 5 2 % 取余(取模 Modulo) 10 % 3 1
// 目标:掌握算数运算的基本语法
int main(void)
{
int m = +3;
int n = -3;
printf("m=%d, n=%d\n", m, n);
int a = 10, b = 5;
printf("a+b=%d\n", a + b);
printf("a-b=%d\n", a - b);
printf("a*b=%d\n", a * b);
printf("a/b=%d\n", a / b);
printf("10%%3=%d\n", 10 % 3); // 在printf的格式串中显示 %号, 需要使用 %%
// 3 % 10 取余结果是多少呢?
printf("3%=%d\n", 3 % 10); // 3
return 0;
}
注意事项:
先 * / %,后 + -。除法两整数相除,结果整数(舍小数部分)两浮点数相除,结果 double 浮点数整数和实数相除,自动类型转换为实型不允许 除 0(与数学一样)取模(取余)运算数必须是整型对负数取余,结果为余数的绝对值不允许 除 0(与数学一样)
// 目标: 掌握算术运算符使用特性
int main(void)
{
// 先乘除后加减
printf("%d\n", 4 + 6 % 5); // 5
// 两整数相除,结果整数(舍小数部分)
printf("%d\n", 19 / 10); // 1
// 两浮点数相除,结果 double 浮点数, 默认保留 6 位小数
printf("%lf\n", 3.6 / 1.3); // 2.769231
// 整数和实数相除,自动类型转换为实型
printf("%lf, %llu\n", 6 / 2.0, sizeof(6/2.0)); // 表达式结果占 8 字节, double 类型.
// 除 0 不允许
printf("%d\n", 6 / 0); // 被零除或对零取余 错误.
// 取余运算,参与运算的操作数,必须为整数
printf("%d\n", 7.3 % 2); // 表达式必须包含整数 错误.
// 对负数取余,结果为余数的绝对值
printf("%d\n", 7 % -5); // 2
// 对 0 取余不允许
printf("%d\n", 6 % 0); // 被零除或对零取模 错误.
return 0;
}
算数运算符有哪些?
运算符 术语 示例 结果 + 正号 +3 3 - 负号 -3 -3 + 加 10 + 5 15 - 减 10 - 5 5 * 乘 10 * 5 50 / 除 10 / 5 2 % 取余(取模 Modulo) 10 % 3 1
// 目标:掌握算数运算的基本语法
int main(void)
{
int m = +3;
int n = -3;
printf("m=%d, n=%d\n", m, n);
int a = 10, b = 5;
printf("a+b=%d\n", a + b);
printf("a-b=%d\n", a - b);
printf("a*b=%d\n", a * b);
printf("a/b=%d\n", a / b);
printf("10%%3=%d\n", 10 % 3); // 在printf的格式串中显示 %号, 需要使用 %%
// 3 % 10 取余结果是多少呢?
printf("3%=%d\n", 3 % 10); // 3
return 0;
}
注意事项:
先 * / %,后 + -。除法两整数相除,结果整数(舍小数部分)两浮点数相除,结果 double 浮点数整数和实数相除,自动类型转换为实型不允许 除 0(与数学一样)取模(取余)运算数必须是整型对负数取余,结果为余数的绝对值不允许 除 0(与数学一样)
// 目标: 掌握算术运算符使用特性
int main(void)
{
// 先乘除后加减
printf("%d\n", 4 + 6 % 5); // 5
// 两整数相除,结果整数(舍小数部分)
printf("%d\n", 19 / 10); // 1
// 两浮点数相除,结果 double 浮点数, 默认保留 6 位小数
printf("%lf\n", 3.6 / 1.3); // 2.769231
// 整数和实数相除,自动类型转换为实型
printf("%lf, %llu\n", 6 / 2.0, sizeof(6/2.0)); // 表达式结果占 8 字节, double 类型.
// 除 0 不允许
printf("%d\n", 6 / 0); // 被零除或对零取余 错误.
// 取余运算,参与运算的操作数,必须为整数
printf("%d\n", 7.3 % 2); // 表达式必须包含整数 错误.
// 对负数取余,结果为余数的绝对值
printf("%d\n", 7 % -5); // 2
// 对 0 取余不允许
printf("%d\n", 6 % 0); // 被零除或对零取模 错误.
return 0;
}
算数运算符有哪些?
2. 比较运算符
基础语法
运算符 作用 示例 结果 < 判断 小于 4 < 3 不成立(假):0 3 成立(真):1 >= 判断 大于或等于 4 >= 4 成立(真):1 == 判断 相等 4 == 3 不成立(假):0 != 判断 不相等 4 != 3 成立(真):1
注意:判断 “相等”,使用 “==”, 不能使用 “=”(赋值符)
优先级
整体,比算术运算符 低。整体,比赋值运算符 高。> >= < 1 && 3>2 &&两边同为真,结果为真,否则为假。 同真为真 || 或 2>1||3 > 5 ||两边有一个为真,结果为真,二者同为假,结果为假。 有真为真 ! 非 ! (2>1) 取反!表达式为假,加 ! 为真;表达式为真,加 ! 为假。 真非为假
案例1 : 需求,手机存储大于 128,手机屏幕尺寸大于等于 6.35**
// 目标: 掌握逻辑运算符语法特性
int main(void)
{
int storage = 256; // 手机存储
double size = 6.3; // 屏幕尺寸
// 需求1: 手机存储大于128, 同时 屏幕尺寸大于等于6.7
printf("%d\n", storage > 128 && size >= 6.7); // && 同真为真
// 需求2: 手机存储大于128, 或者 屏幕尺寸大于等于6.7
printf("%d\n", storage > 128 || size >= 6.7); // || 有真为真
// !非,取反的意思
printf("%d\n", !6); // 非真为假
printf("%d\n", !0); // 非假为真
printf("%d\n", !(7 < 9)); // 思考结果是什么? --> 0
//(使用时特殊情况)判断 20 是介于 10 和 30 之间的数
// 错误写法
printf("%d\n", 30 > 20 > 10); // C 语言不支持,数学中连续判断的语法
// 正确写法
printf("%d\n", 30 > 20 && 20 > 10);
return 0;
}
案例2 : 判断 20 是介于 30 和 10 之间的数。
// 错误写法
printf("%d\n", 30 > 20 > 10); // C 语言不支持,数学的这种连续判断的语法
// 正确写法
printf("%d\n", 30 > 20 && 20 > 10);
短路运算
逻辑运算符的特性,导致实际应用中一部分表达式不执行,也能得出整个表达式结果。这一特点经常作为考点出现在计算机二级、期末考试题中。
在程序中:
**概念:逻辑表达式 运算过程中,只运算左边表达式,就能直接得出整个逻辑表达式的结果。—— 短路运算 **
短路运算作用
在代码中利用短路运算,可 避免不必要运算,提高程序执行效率。 比如有如下代码:
int a = 5, b = 28;
int c = (a > 3) || ((b / 7)*4 % 2 != 0)
printf("c = %d\n", c);
现要计算 c 值。= 右侧表达式含有逻辑或 || 运算符,运算特性 有真为真。|| 左边表达式很容易判断为 真,可确定整个表达式结果为 真。 右侧 b 相关的 复杂表达式 不需要计算 。
短路运算特性
左表达式能直接得逻辑表达式结果,右表达式不执行。
案例 1:以下代码执行后,a、b、c 的值依次是多少?
// 目标: 掌握运算特性
int main(void)
{
int a = 1, b = 2, c = 3;
(a = b + c) || (++b) ;
printf("a=%d, b=%d, c=%d\n", a, b, c);
return 0;
}
简单分析代码。 很可能得出结论: a = 5,b = 3,c = 3
但,实际上这里的 b 并没有完成自增运算,值还是 2。 为什么 有前缀 ++ 自增,b 值还是 2 呢? 因为 短路运算!++b 并未执行。
逻辑 || 运算符,运算特性有真为真。 左侧 a = b+c 赋值表达式很容易得出结果为真。 因此 整个 表达式得出结论为真,右侧 ++b 并不需要执行。 因此快连,即使是 前缀自增,b 没有执行机会,值依然为 2。
正确输出结果:a = 5,b = 2,c = 3
案例 2:分析代码,推测 a, x, y 的值分别是什么?
// 目标: 掌握运算特性
int main(void)
{
int x = 1, y = 5, a;
a = --x && ++y;
printf("a=%d, x=%d, y=%d\n", a, x, y);
return 0;
}
同样是逻辑运算表达式,逻辑与&& 运算符,运算特性 同真为真。 x 初值为 1,前缀 --x 执行 结果为 0快连,假。依然会触发短路运算特性。右侧 ++y 不执行。
因此,输出结果为:a=0, x=0, y=5
案例 3: 依然上述案例 2代码,将 --x 修改为 x--,输出结果为何?
// 目标: 掌握运算特性
int main(void)
{
int x = 1, y = 5, a;
a = x-- && ++y;
printf("a=%d, x=%d, y=%d\n", a, x, y);
return 0;
}
修改后,x-- 由于是 后缀,因此 先取值 1 为真(而后再-1),所以没有触发 短路运算,继续运算 右侧 ++y,将 y 值自增为 6。 1 && 6 结果为真, a 值为 1。
因此,输出结果为:a=1, x=0, y=6
小知识:合理利用短路运算特性,提高程序执行效率
总结
6. 条件运算符
基础语法
语法:表达式1 ?表达式 2:表达式 3
运算规则:
能解决什么问题呢?比如,查询成绩系统中,根据成绩判定是否及格?可以用 三目运算来进行判断。
案例 1:接收学生成绩,判断是否 及格,给出 Y/N 结果。**
// 目标: 掌握 三目运算语法特性
int main(void)
{
double score;
printf("请输入成绩:");
scanf("%lf", &score);
char res = score >= 60 ? 'Y' : 'N'; // 三目运算结果 赋值给 res 变量
printf("是否及格? %c\n", res);
return 0;
}
案例 2:找出两个数中的较小值
// 目标: 掌握 三目运算语法特性
int main(void)
{
int a = 10;
int b = 20;
printf("较小值为:%d\n", a < b ? a : b); // 三目运算结果在 printf 中使用
return 0;
}
特性和嵌套应用
嵌套条件运算符的写法,在实际编程中较少见,因为代码可读性低。 但,计算机考试中,经常出做考点。
辨别技巧是,当 表达式中 有 2 个以上问号、冒号,一定是发生了 三目运算嵌套。
处理方法是,先将位于右边的 “?” 与它后面最近一个 “:” 配对。因为,条件运算符的结合性,自右向左。
优先级,高于赋值运算符,低于算数、逻辑、比较运算符。
案例 1:
int res = w < x ? x + w : x < y ? x : y // w < x ? x + w :(x < y ? x : y)
将 右侧的 ?与后面的 :配对,x < y ? x : y 看做一组 三目运算表达式,作为另外一组 三目运算的 表达式 3。
案例 2:
int res = a > b ? c > d ? e : f : g // a > b ? (c > d ? e : f ): g
将 右侧的 ?与后面的 :配对,c > d ? e : f 看做一组 三目运算表达式,作为另外一组 三目运算的 表达式 2。
这种嵌套写法,看其他人写的程序时,能看懂即可。我们不要这样写。
总结
验收案例
练习1:分析程序,执行结束后 a、b、res 的值分别是多少?**
int main(void)
{
int a = 3, b = 4, c = 5, d = 6;
int res = a > b ? a++ : c > d ? ++a : b++;
printf("a = %d, b = %d, res = %d\n", a, b, res);
return 0;
}
练习2:使用三目运算符,编写程序实现找出三个数中的最大值。**
// 方法 1:
int main(void)
{
int a = 11;
int b = 22;
int c = 35;
int ab_max = a > b ? a : b;
int max = c > ab_max ? c : ab_max;
printf("abc最大值为:%d\n", max);
return 0;
}
// 方法 2:
int main(void)
{
int a = 1, b = 2, c = 3;
int max = c > (a > b ? a : b) ? c : a > b ? a : b;
printf("abc最大值为:%d\n", max);
return 0;
}
7,逗号运算符
C语言中,逗号也是一种运算符。 用逗号将多个表达式连接起来,组成逗号表达式。一般形式为:
表达式 1,表达式 2,表达式 3,....,表达式 n
如:a+3, b+4, c+5 是一个 逗号表达式。
求解过程是 自左向右 依次求解。 整个逗号表达式的值,为最后一个表达式 n 的值。
逗号运算符的优先级,是所有运算符中最低的。
练习:分析下面代码执行过程。res 值为多少?
int i = 3;
int res = (i++, ++i, i + 5);
printf("res = %d\n", res);
总结 取整个逗号表达式值的做法,在实际编程中不常用到。 但,计算机考试中快连,经常出做考点。记住两句话就好了:
练习
分析下列程序执行,i 值为多少?
int i, a;
i = (a = 2 * 3, a * 4), a + 6;
printf("%d\n", i); // i 值为 24。 因为优先级的原因,i存储的不是 整个逗号表达式的值。
8.运算符优先级
运算符 名称 数组下标 () 圆括号 - 负号 ++、-- 自增、自减
windows:先++优于后++
mac、Linux从左到右依次计算 & 取地址运算符 ! 逻辑非 (类型) 强制类型转换 sizeof 长度运算符 * 乘 / 除 % 取余 + 加 - 减 > 大于 >= 大于等于 < 小于

