[C语言] 算数运算符

一、前言

        算术运算符可以用来计算数据, 它包含了加, 减, 乘, 除, 取模五种运算符, 以及递增递减运算. 下面分别来介绍这五种运算符以及两种运算的用法.

二、运算符

2.1 加法

        加法就是使用一个或多个加号"+", 使两个或两个以上的数字进行加法运算的符号. 下面展示用C语言实现两个和三个数进行加法计算并输出的例子:
  例1:

#include <stdio.h>
int main()
{
    printf("%d\n", 1 + 2); // 两个数字相加, 1+2=3
    printf("%d\n", 1 + 2 + 3); // 三个数相加, 1+2+3=6
    return 0;
}

        输出结果:
例1输出

2.2 减法

        减法就是使用一个或多个减号"-", 使两个或两个以上的数字进行相减的运算. 下面展示用C语言实现两个和三个数进行减法计算并输出的例子:
        例2:

#include <stdio.h>
int main()
{
    printf("%d\n", 2 - 1); // 两个数字相减, 2-1=1
    printf("%d\n", 3 - 2 - 1); // 三个数相减, 3-2-1=0
    return 0;
}

        输出结果:
例2输出

2.3 乘法

        乘法就是使用一个或多个乘号"*", 使两个或两个以上的数字进行相乘的运算. 下面展示用C语言实现两个和三个数进行乘法计算并输出的例子:
        例3:

#include <stdio.h>
int main()
{
    printf("%d\n", 1 * 2); // 两个数字相乘, 1*2=2
    printf("%d\n", 1 * 2 * 3); // 三个数相乘, 1*2*3=6
    return 0;
}

  输出结果:
例3输出

2.4 除法

        除法就是使用一个或多个除号"/", 使两个或两个以上的数字进行相除的运算. 下面展示用C语言实现两个和三个数进行除法计算并输出的例子:
        例4:

#include <stdio.h>
int main()
{
    printf("%d\n", 1 / 2); // 两个数字相除, 1/2=0(int类型运算规则, 不保留小数位)
    printf("%d\n", 3 / 2 / 1); // 三个数相除, 3/2/1=1
    return 0;
}

        输出结果:
例4输出

问: 为什么三个数相除3/2/1最后输出的结果为1呢?
答: 这和printf()输出语句所使用的占位符与int类型除法法则有关. "%d"代表的是十进制整数, 因此它不能输出十进制小数, 这时它只能输出整数. 而int类型与int类型的数据相除, 是直接去掉小数位, 仅保留整数结果. 因此看到的输出结果只有一位整数, 并且没有进行四舍五入的操作. 有关占位符的内容请看这篇文章[C语言] printf()函数及占位符的使用

问: 要怎样才能输出小数结果呢?
答: 由于"3 / 2 / 1"这个表达式进行计算的数据为int类型, 因此编译器默认是使用int类型相除的法则进行计算. 若要使输出结果显示小数位, 就要进行强制转换数据类型的操作. 具体详见下方例子:

        例5:

#include <stdio.h>
int main()
{
	double a = (double)3 / 2 / 1; // 以double为例, 将int类型的3强转位double类型
	printf("%.2f\n", a); // 占位符精确到小数点后两位
	return 0;
}

        输出结果:
例5输出

        或者也可以将其中一位数字改为小数, 使之变为double类型的数据进行计算:
        例6:

#include <stdio.h>
int main()
{
	double a = 3.0 / 2 / 1; // 添加小数转换数据类型
	printf("%.2f\n", a); // 占位符精确到小数点后两位
	return 0;
}

        输出结果:
例6输出

2.5 取模

        取模就是就是使用取模符号"%", 将两个数字进行取模的运算.
        所谓取模运算, 就是计算两个数整除之后的余数的运算, 通常来判断其中一个数是否为奇数或者是偶数. 下面展示用C语言实现两个数进行取模计算并输出的例子:
        例7:

#include <stdio.h>
int main()
{
    printf("%d\n", 31 % 2); // 两个数字相除, 31/2的余数为1, 因此31%2=1
    return 0;
}

        输出结果:
例7输出

  注意: 取模运算通常只适用于两个int类型的整数的计算.

三、自增自减运算

3.1 后置++与后置--

3.1.1 后置++

        后置++通常用于条件判断语句和循环语句. 它的作用是递增变量, 即将变量递增1.
   格式: 变量名++;
        解释: 将变量递增1
        例8:

#include <stdio.h>
int main()
{
	int a = 0;
	a++;
	printf("a++ = %d\n", a); // 将a递增1, 并输出. 此时输出 a++ = 1
    return 0;
}

        输出结果:
例8输出

3.1.2 后置--

        后置--通常也是用于条件判断语句和循环语句的运算符, 它的作用是递减变量, 即将变量递减1.
   格式: 变量名--;
        解释: 将变量递减1
        例9:

#include<stdio.h>
int main()
{
	int a = 2;
	a--;
	printf("a-- = %d\n", a); // 使用后置--将a递减1, 并输出. 此时 a-- = 1.
	return 0;
}

        输出结果:
例9输出

3.2 前置++与前置--

        前置++和前置--在初学阶段比较不常用, 但也可以了解一下. 了解这些对于编写正确和高效的代码非常重要, 特别是在涉及复杂表达式或需要精确控制变量值的场景中.
        前置与后置的主要区别就是返回结果和递增或递减的顺序. 在使用后置++--时, 是先返回该变量的值, 再对该变量进行递增或递减运算; 使用前置++--时, 是先对该变量进行递增或递减运算, 再返回该变量的值.
        下面以递增运算举例介绍前置++与后置++的区别:
        例10: 前置++与后置++的对比

#include<stdio.h>
int main()
{
	// 定义初始变量
	int a = 0;
	int b = 0;
	
	/*后置++*/
	int res1 = a++;
	// 先返回a的原始值,赋值给res1, 再对a进行递增运算.
	printf("初始变量值: %d; 递增后变量的值: %d\n", res1, a); // 此时输出结果分别为0; 1.
	
	/*前置++*/
	int res2 = ++b;
	// 先对b进行递增计算,赋值给res2, 再返回b的值.
	printf("初始变量值: %d; 递增后变量的值: %d\n", res2, b); // 此时输出结果分别为1; 1.
	
	return 0;
}

        输出结果:
例10输出

3.2.1 前置++

        理解了上方的例子, 再理解下方有关与前置++的例子就很轻松了.
        例11: 前置++

#include<stdio.h>
int main()
{
	// 定义初始变量
	int a = 0;
	// 将++a赋值给res
	int res = ++a;
	// 输出res以及a的值. 先进行递增运算, 再赋值.
	printf("res = %d; a = %d\n", res, a);
	return 0;
}

        输出结果:
例11输出

3.2.2 前置--

        下面对前置--举个例子:
        例12: 前置--

#include<stdio.h>
int main()
{
	// 定义初始变量
	int a = 0;
	// 将--a赋值给res
	int res = --a;
	// 输出res以及a的值. 先进行递减运算, 再赋值.
	printf("res = %d; a = %d\n", res, a);
	return 0;
}

        输出结果:
例12输出

四、复合赋值符的使用

        首先看看下方这几个符号:
        +=, -=, *=, /=, %=
        这就是复合赋值符. 复合赋值符可以和赋值符号同时使用, 这就是复合赋值符. 复合赋值符可以减少多余变量的定义, 使代码更加清晰简洁.
        通过观察上方举例的几个复合赋值符, 可以发现, 在赋值符“=”之前加上其它二目运算符可构成复合赋值符. 那么复合赋值符要如何理解呢?
        a = a + 1    ⟺    \iff a += 1
        下面以%=举例:
        例13:%=

#include<stdio.h>
int main()
{
	int a = 10;
	a %= 2; // 将a与2进行取模运算, 最后重新赋值给a.
	printf("a %%= 2 后 a = %d\n", a);
	return 0;
}

        输出结果:
例13输出

五、运算优先级

        在编程中, 运算同样存在优先级的问题. 下方总结了+, -, *, /, %这五种运算符的优先级:
* = / = % > + = -
        举例:
在表达式 a + b * c / d % e 中, 根据运算符的优先级, 运算的执行顺序是:

    1. 乘法 b * c
    1. 除法 上一步结果 / d
    1. 取模 上一步结果 % e
    1. 加法 a + 最终结果

        如果需要改变默认的计算顺序, 可以使用小括号 () 来提高指定表达式的运算优先级. 例如, (a + b) * (c / d) % e 将首先计算括号内的表达式, 然后再按照运算符的优先级计算整个表达式.

六、注意事项

        在C语言中, 运算符的使用是非常重要的, 同时也存在一些容易忽视的细节和注意事项. 以下是一些注意事项:

  • 1. 数据类的型转换: 在运算过程中, 可能会发生隐式类型转换(如整数和浮点数混合运算时).
  • 2. 注意原始变量的值: 使用自增自减运算符和赋值运算符等可能改变变量原始的值, 在使用这些运算符之后使用该变量时要注意原始变量的值的改变.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

w147288

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值