算术运算符

2026-03-13 18:11:24 37阅读
广告一

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 长度运算符 * 乘 / 除 % 取余 + 加 - 减 > 大于 >= 大于等于 < 小于

文章版权声明:除非注明,否则均为晋安小号网原创文章,转载或复制请以超链接形式并注明出处。