【C】算术运算符

运算符

C语言通过提供运算符来支持我们对数据进行处理

赋值运算符

赋值运算符: =

赋值运算符的左边必须是一个lvaule(左值),变量名就是lvaule,常量就不是lvaule

int a;
a = 5;

如果试图就非lvalue放在左边就会出错

int a;
5 = a; //报错

关于lvaulervaule请参考: 什么是 lvalue,什么是 rvalue?

自增自减运算符

i = i + 1 <==> i++++i

i = i - 1 <==> i----i

i++ 与 ++i 的区别

int main()
{
    int i = 5,j;
    j = ++i;
    printf("i = %d, j = %d\n", i, j);
    
    i = 5;
    j = i++;
    printf("i = %d, j = %d\n", i, j);
    return 0;
}

运行结果:

i = 6, j = 6
i = 6, j = 5

区别:从程序运行结果可以看出,i++先使用变量的值进行运算,然后再对自身加1。而++i则是先对变量的值加1再进行运算

注意自增自减运算符只能作用于变量,不能作用于常量或表达式

逗号运算符

i = 1; j = 2; k = 3; <==> i = 1, j= 2, k =3;

逗号表达式

  • 语法:表达式1, 表达式2, ... , 表达式n
  • 逗号表达式的运算过程从左往右逐个计算表达式
  • 逗号表达式作为一个整体,它的值为最后一个表达式的值(也即表达式n)的值
  • 逗号运算符优先级比赋值运算符低,a = 3, 5 <==> a = 3; 5
  • a = ( b = 3, (c = b + 4 ) + 5)
    • 先将变量b赋值为3
    • 然后将变量c赋值为b+4的和,也就是7
    • 接下来把c的值加上5
    • 最后赋值给变量a,得到变量a的值为12

条件运算符

  • 语法: exp1 ? exp2 : exp3;

    • exp1是条件表达式
    • 如果结果为真,返回exp2
    • 如果结果为假,返回exp3

    比如说下面几行代码

    if (a > b)
        max = a;
    else
        max = b;
    

    等价于

    max = a > b ? a: b

下标运算符: []

算数运算符

运算符 名称 例子 结果
+ 加法运算符(双目) 5   +   3 8
- 减法运算符(双目) 5   -   3 2
* 乘法运算符(双目) 5   *   3 15
/ 除法运算符(双目) 5   /   3 1
5.0   /   3.0 1.666667
% 求余运算符(双目) 5   %   3 2
5.0   %   3.0 出错
正号运算符 + +5 5
负号运算符 - -5 -5
**注意:**对于整数之间的除法,如果两个操作数都是整数,那么结果采用**舍弃小数**的形式,如 5/3=1 ; 如果两个操作数都是浮点数,那么它的结果也是浮点数,**会四舍五入精确到第六位**,如 5.0 / 3.0 =1.666667

我们把运算符作用的操作对象称为操作数。比如: 1 + 2 ,"+"是加法运算符,它作用的两个操作对象"1"和"2"就叫作操作数。

对于一个运算符是单目还是双目,取决于它有多少个操作数。例如: 当"+"表示加号时,比如1+2,它会把左边的操作数和右边的操作数相加,此时它是双目运算符;当"+"表示正号时,比如+5 , 它只是表示一个数为正数,此时它是单目运算符

表达式

  • 用运算符和括号将操作数连接起来的式子,我们称之为表达式。比如:
    • 1 + 1
    • 'a' + 'b'
    • a + b
    • a + 'b' + pow(a, b) * 3 / 4 + 5

运算符的优先级和结合性

单目运算符优先级高于双目运算符

请参考 :运算符的优先级和结合性

#include<stdio.h>
#include<math>
int main(){
    int i, j, k;
    
    i = 1 + 2; // 3
    j = 1 + 2 * 3;  // 7
    k = i + j + -1 + pow(2,3); // 3 + 7 + -1 + 8 =17
    printf("i = %d\n",i); // i - 3
    printf("j = %d\n",j); // j = 7
    printf("k = %d\n",k); // k = 17
    return 0;
}

类型转换

1 + 2.0 == 1.0 + 2.0

当一个运算符的几个操作数类型不同的时候,如上方加法运算符左右两边操作数类型不同,编译器需要在计算前,需要将它们共同转换为某种数据类型。通常情况下,编译器会将占用坑位较小的操作数先转换为占用坑位较大的操作数的数据类型,然后再进行运算,比如说整形和浮点型相加,会先将整形转换为浮点型,再进行相加。

#include<stdio.h>
#include<math>
int main(){
    printf("整形输出 : %d\n", 1 + 2.0); 
    printf("浮点型输出 :%f\n",1 + 2.0); 
    return 0;
}

运行结果:

整形输出:0
浮点型输出: 3.000000

可以看到,如果把一个浮点型的数强制用整形输出,那么结果就会出错。但可以在计算前改变浮点型的数据类型,从而使结果能用整形输出,方法为:在操作数的前边用小括号将目标的数据类型括起来。比如:

#include<stdio.h>
int main(){
    printf("整形输出 : %d\n", 1 + (int)2.0); 
    printf("浮点型输出 :%f\n",1 + 2.0); 
    return 0;
}

运行结果

整形输出:3
浮点型输出: 3.000000

但是要注意,强制转换浮点数类型为整形,是直接把小数位去掉,而不是四舍五入。比如

#include<stdio.h>
int main(){
    printf("整形输出 : %d\n", 1 + (int)1.8); 
    return 0;
}

运行结果:

整形输出:2
posted @ 2025-02-14 21:06  芝麻凛  阅读(44)  评论(0)    收藏  举报