Bootstrap

C语言导航 3.2基本运算符

### 第二节 基本运算符

* 算术运算符
* 赋值运算符
* 逗号运算符
* 条件运算符
* 关系运算符
* 逻辑运算符
* 位运算符

#### 3.2.1 算术运算符

内容:

| 运算符号 | 名称 | 目数 | 优先级 | 结合性   | 作用               |
| -------- | ---- | ---- | ------ | -------- | ------------------ |
| +        | 加   | 双目 | 4      | 自左至右 | 求两操作数的和     |
| -        | 减   | 双目 | 4      | 自左至右 | 求两操作数的差     |
| *        | 乘   | 双目 | 3      | 自左至右 | 求两操作数的积     |
| /        | 除   | 双目 | 3      | 自左至右 | 求两操作数的整数商 |
| %        | 求模 | 双目 | 3      | 自左至右 | 求两操作数的余数   |
| +        | 求正 | 单目 | 2      | 自右至左 | 求操作数           |
| -        | 求负 | 单目 | 2      | 自右至左 | 求操作数的负数     |
| ++       | 自增 | 单目 | 2      |          | 操作数自增1        |
| --       | 自减 | 单目 | 2      |          | 操作数自减1        |

注意:

(1)对于“/”运算,如果两个操作数中有实型,则运算结果为实型;如果两个均为整型,则运算结果为整型(即实型除去小数部分)。

(2)对于“%”运算,参与操作数的两个操作数必须为整型,其中被模除数不能为0,其结果的正负性与被模除数一致。

(3)对于自增、自减运算分为前置与后置两种,前置将优先自增减,后置则反之。

##### 【程序现场】3-2-1

```C
#include<stdio.h>
int main(void)
{
    printf("%d + %d = %d\n",4,3,4+3);
    printf("%d - %d = %d\n",4,3,4-3);
    printf("%d * %d = %d\n",4,3,4*3);
    printf("%d / %d = %d\n",4,3,4/3);
    printf("%d / %d = %f\n",4,3,4/3);
    printf("+%d = %d\n",4,+4);
    printf("-%d = %d\n",3,-3);
    printf("\n");
    
    int a=10,b=10;
    printf("++a = %d\n",++a);
    printf("b++ = %d\n",b++);
    printf("b = %d",b);
    
    return 0;
}
```

#### 3.2.2 赋值运算符

作用:将右边表达式的值赋给左边的变量。

内容:

| 运算符号 | 名称 | 目数 | 优先级 | 结合性   | 作用                                   |
| -------- | ---- | ---- | ------ | -------- | -------------------------------------- |
| =        | 赋值 | 双目 | 14     | 自右至左 | 将右边赋值给左边                       |
| +=       | ——   | 双目 | 14     | 自右至左 | 将右表达式的值与左操作数相加并赋值     |
| -=       | ——   | 双目 | 14     | 自右至左 | 将右表达式的值与左操作数相减并赋值     |
| *=       | ——   | 双目 | 14     | 自右至左 | 将右表达式的值与左操作数相乘并赋值     |
| /=       | ——   | 双目 | 14     | 自右至左 | 将右表达式的值与左操作数相除并赋值     |
| %=       | ——   | 双目 | 14     | 自右至左 | 将右表达式的值与左操作数相模除并赋值   |
| <<=      | ——   | 双目 | 14     | 自右至左 | 将左操作数左移右表达式的值次           |
| >>=      | ——   | 双目 | 14     | 自右至左 | 将左操作数右移右表达式的值次           |
| &=       | ——   | 双目 | 14     | 自右至左 | 将右表达式的值与左操作数按位与并赋值   |
| ^=       | ——   | 双目 | 14     | 自右至左 | 将右表达式的值与左操作数按位异或并赋值 |
| \|=      | ——   | 双目 | 14     | 自右至左 | 将右表达式的值与左操作数按位或并赋值   |

注意:

(1)赋值表达式可以与其他表达式进行嵌套。

##### 【程序现场】3-2-2

```C
#include<stdio.h>
int main(void)
{
    int a=4+2*3;
    printf("a = %d\n",a);
    a += 1+2;
    printf("a = %d\n",a);
    a -= 1+2;
    printf("a = %d\n",a);
    a *= 1+2;
    printf("a = %d\n",a);
    a /= 2;
    printf("a = %d\n",a);
    a %= 9;
    printf("a = %d\n",a);
    a >>= 2;
    printf("a = %d\n",a);
    a <<= 2;
    printf("a = %d\n",a);
    printf("\n");
    
    a = 5;
    a &= 2; //101 & 010
    printf("a = %d\n",a);
    a ^= 2; //101 ^ 010
    printf("a = %d\n",a);
    a |= 2; //101 | 010
    printf("a = %d\n",a);
    printf("\n");
    
    return 0;
}
```

#### 3.2.3 逗号运算符

内容:

| 运算符号 | 名称 | 目数 | 优先级 | 结合性   | 作用               |
| -------- | ---- | ---- | ------ | -------- | ------------------ |
| ,       | 逗号 | 双目 | 15     | 自左至右 | 将各表达式依次连接 |

注意:

(1)逗号表达式可以嵌套,与其他表达式产生多种多样的组合。

(2)多个逗号表达式其返回值是最右边表达式的值。

##### 【程序现场】3-3-3

```C
#include<stdio.h>
int main(void)
{
    int a;
    4+5,a=4;
    printf("a = %d\n",a);
    printf("a = %d\n",a=4+5,a*2,9-5);
    
    return 0;
}
```

#### 3.2.4 条件运算符

内容:

| 运算符号 | 名称       | 目数 | 优先级 | 结合性   | 作用                       |
| -------- | ---------- | ---- | ------ | -------- | -------------------------- |
| ?  :     | 条件运算符 | 三目 | 13     | 自右至左 | 选择性执行第二或三个表达式 |

用法:表达式1 ?  表达式2 : 表达式3

规则:如果表达式1的值为非0,则执行并返回表达式2及值,否则执行并返回表达式3及值。

注意:

(1)虽然条件运算符的判断及执行顺序为:表达式1->表达式2或表达式1->表达式3,但结合性为自右至左,所以在进行嵌套等操作时优先执行右边的表达式中的内容。

##### 【程序现场】3-2-4

```C
#include<stdio.h>
int main(void)
{
    int a,b;
    a = 1-4 ? 1 : 2 ;
    printf("a = %d\n",a);
    a = 4-4? b=1 : 2-1? b=2: 3;
    printf("a = %d\n",a);
    printf("b = %d\n",b);
    
    return 0;
}
```

####     3.2.5 关系运算符

内容:

| 运算符号 | 名称     | 目数 | 优先级 | 结合性   | 作用                             |
| -------- | -------- | ---- | ------ | -------- | -------------------------------- |
| <        | 小于     | 双目 | 6      | 自左至右 | 判断前操作数是否小于后操作数     |
| <=       | 小于等于 | 双目 | 6      | 自左至右 | 判断前操作数是否小于等于后操作数 |
| >        | 大于     | 双目 | 6      | 自左至右 | 判断前操作数是否大于后操作数     |
| >=       | 大于等于 | 双目 | 6      | 自左至右 | 判断前操作数是否大于等于后操作数 |
| ==       | 等于     | 双目 | 7      | 自左至右 | 判断前操作数是否等于后操作数     |
| !=       | 不等于   | 双目 | 7      | 自左至右 | 判断前操作数是否不等于后操作数   |

注意:

(1)在C语言中真为非零,假为零。而关系运算符判断的真结果为1,假为0。

##### 【程序现场】3-3-5

```C
#include<stdio.h>
int main(void)
{
    printf("%d < %d = %d\n",1,2,1<2);
    printf("%d <= %d = %d\n",1,2,1<=2);
    printf("%d > %d = %d\n",1,2,1>2);
    printf("%d >= %d = %d\n",2,2,2>=2);
    printf("%d == %d = %d\n",1,2,1==2);
    printf("%d != %d = %d\n",1,2,1!=2);
    
    return 0;
}
```

#### 3.2.6 逻辑运算符

内容:

| 运算符号 | 名称   | 目数 | 优先级 | 结合性   | 作用               |
| -------- | ------ | ---- | ------ | -------- | ------------------ |
| !       | 逻辑非 | 单目 | 2      | 自右至左 | 将操作数的真假取反 |
| &&       | 逻辑与 | 双目 | 11     | 自左至右 | 将两操作数相与     |
| \|\|     | 逻辑或 | 双目 | 12     | 自左至右 | 将两操作数相或     |

注意:

(1)逻辑非的运算规则是:将非零的操作数返回0值,将值为零的操作数返回1值。

(2)逻辑与的运算规则是:当两操作数都为真时,结果为真;否则为假。当左操作数为假时,将不执行右表达式。

(3)逻辑与的运算规则是:至少一个操作数都为真时,结果为真;否则为假。当左操作数为真时,将不执行右表达式。

##### 【程序现场】3-3-6

```C
#include<stdio.h>
int main(void)
{
    printf("!%d = %d\n",1,!1);
    printf("%d && %d = %d\n",0,2,0&&2);
    printf("%d || %d = %d\n",0,2,0||2);
    printf("\n");
    
    int a,b=10,c=10;
    a=1 && ++b || c--;
    printf("a = %d\n",a);
    printf("b = %d\n",b);
    printf("c = %d\n",c);

    return 0;
}
```

#### 3.2.7 位运算符

内容:

| 运算符号 | 名称     | 目数 | 优先级 | 结合性   | 作用                       |
| -------- | -------- | ---- | ------ | -------- | -------------------------- |
| &        | 按位与   | 双目 | 8      | 自左至右 | 将两操作数的二进制数相与   |
| \|       | 按位或   | 双目 | 10     | 自左至右 | 将两操作数的二进制数相或   |
| ^        | 按位异或 | 双目 | 9      | 自左至右 | 将两操作数的二进制数相异或 |
| ~        | 按位非   | 单目 | 2      | 自右至左 | 将操作数的二进制数取反     |
| <<       | 左移     | 双目 | 5      | 自左至右 | 将操作数的二进制数左移     |
| >>       | 右移     | 双目 | 5      | 自左至右 | 将操作数的二进制数右移     |

注意:

(1)左移时将最高位丢弃,最低位补0;右移时最低为丢弃,最高位不变。

##### 【程序现场】3-3-7

```C
#include<stdio.h>
int main(void)
{
    printf("%d & %d = %d\n",9,3,9&3);
    printf("%d | %d = %d\n",9,3,9|3);
    printf("%d ^ %d = %d\n",9,3,9^3);
    printf("~%d = %d\n",5,~5);
    printf("%d << %d = %d\n",-5,2,-5<<2);
    printf("%d >> %d = %d\n",-5,2,-5>>2);

    return 0;
}
```

;