c基础语法03
c基础语法03
1. 算术运算符
1. 算术运算符
C 语言通过提供大量的运算符来支持我们对数据进行处理,前边我们将一个值存放到变量中,使用的是赋值运算符,就是等于号(=),上节课对字符串中的某个字符进行索引,使用方括号([])作为下标运算符实现。
这一节我们谈的是 C 语言中最常用的运算符——算数运算符。

这里有几点要跟大家说一下:
- 因为键盘上没有乘号和除号两个按键,所以用星号(*)和斜杠(/)代替,这几乎是潜规则了。
- 对于整数间的除法是采取直接舍弃小数部分的方式,而不是什么四舍五入噢。
- 对于浮点数间的除法则能获得一个相对逼近结果的值(如果除不尽或位数特别多的话)。
- 百分号(%)在这里是表示求余数的意思,但求余运算符要求两边的操作数都要是整数,其结果也是整数。
2. 何谓“目”?
大家可能看到有些运算符后边写双目,有些写单目,那么什么是目呢?
我们把被运算符作用的运算对象称之为操作数,比如 1 + 2,那么 1 和 2 就是被加法运算符(+)作用的两个操作数。我们说一个运算符是双目运算符还是单目运算符,就是看它有多少个操作数。
3. 表达式
用运算符和括号将操作数连接起来的式子,我们称之为表达式。
- 1 + 1
- 'a' + 'b'
- a + b
- a + 'b' + pow(a, b) * 3 / 4 + 5
4. 运算符的优先级和结合性
注1:优先级相同的运算符,运算次序由结合性决定。
- 比如 3 * 4 / 5 % 6,其中乘号、除号和求余运算符在同一优先级,结合性是“左到右”,因此先计算 3 * 4,再计算 / 5,最后计算 % 6
- 再如 -i++,符号和自增运算符在同一优先级,结合性是“右到左”,因此 -i++ 相当于 -(i++)
注2: 目运算符是指操作数的个数,比如单目运算符只有一个操作数,双目运算符有两个操作数,而三目运算符则有三个操作数。*
注3:通过使用小括号可以提升表达式的优先级至最高。
- 比如 (1 + 2) * (3 - 4),其中加号、减号运算符的优先级本身是要低于乘号运算符的,但由于使用了小括号,且结合性均是“左到右”,所以先计算 (1 + 2),再计算 (3 - 4),最后才将前两者的结果相乘
#include <stdio.h>
#include <math.h>
int main()
{
int i,j,k;
i= 1+2;
j= 1+2*3;
k= i + j + -1 + pow(2,3);
printf("i=%d\n",i);//3
printf("j=%d\n",j);//7
printf("k=%d\n",k);//17
return 0;
}
| 优先级 | 运算符 | 含义 | 使用形式 | **结合性 ** | 说明 |
|---|---|---|---|---|---|
| 1 | [ ] | 数组下标 | 数组名[整型表达式] | 左到右 → | |
| ( ) | 圆括号 | (表达式) | |||
| . | 成员选择(对象) | 对象.成员名 | |||
| -> | 成员选择(指针) | 对象指针->成员名 | |||
| ++ | 自增运算符 | 变量名++ | 单目运算符 | ||
| -- | 自减运算符 | 变量名-- | 单目运算符 | ||
| 2 | - | 负号运算符 | -表达式 | 右到左← | 单目运算符 |
| (类型) | 强制类型转换 | (数据类型)表达式 | 单目运算符 | ||
| ++ | 自增运算符 | ++变量名 | 单目运算符 | ||
| -- | 自减运算符 | --变量名 | 单目运算符 | ||
| * | 取值运算符 | *指针表达式 | 单目运算符 | ||
| & | 取地址运算符 | &左值表达式 | 单目运算符 | ||
| ! | 逻辑非运算符 | !表达式 | 单目运算符 | ||
| ~ | 按位取反运算符 | ~表达式 | 单目运算符 | ||
| sizeof | 长度运算符 | sizeof 表达式或sizeof(类型) | 单目运算符 | ||
| 3 | / | 除 | 表达式 / 表达式 | 左到右→ | 双目运算符 |
| * | 乘 | 表达式 * 表达式 | 双目运算符 | ||
| % | 余数(取模) | 整型表达式 % 整型表达式 | 双目运算符 | ||
| 4 | + | 加 | 表达式 + 表达式 | 左到右→ | 双目运算符 |
| - | 减 | 表达式 - 表达式 | 双目运算符 | ||
| 5 | << | 左移 | 表达式 << 表达式 | 左到右→ | 双目运算符 |
| >> | 右移 | 表达式 >> 表达式 | 双目运算符 | ||
| 6 | > | 大于 | 表达式 > 表达式 | 左到右→ | 双目运算符 |
| >= | 大于等于 | 表达式 >= 表达式 | 双目运算符 | ||
| < | 小于 | 表达式 < 表达式 | 双目运算符 | ||
| <= | 小于等于 | 表达式 <= 表达式 | 双目运算符 | ||
| 7 | == | 等于 | 表达式 == 表达式 | 左到右→ | 双目运算符 |
| != | 不等于 | 表达式 != 表达式 | 双目运算符 | ||
| 8 | & | 按位与 | 整型表达式 & 整型表达式 | 左到右→ | 双目运算符 |
| 9 | ^ | 按位异或 | 整型表达式 ^ 整型表达式 | 左到右→ | 双目运算符 |
| 10 | | | 按位或 | 整型表达式 | 整型表达式 | 左到右 → | 双目运算符 |
| 11 | && | 逻辑与 | 表达式 && 表达式 | 左到右 → | 双目运算符 |
| 12 | || | 逻辑或 | 表达式 || 表达式 | 左到右 → | 双目运算符 |
| 13 | ?: | 条件运算符 | 表达式1? 表达式2: 表达式3 | 右到左 ← | 三目运算符 |
| 14 | = | 赋值运算符 | 变量 = 表达式 | 右到左 ← | 双目运算符 |
| /= | 除后赋值 | 变量 /= 表达式 | 双目运算符 | ||
| *= | 乘后赋值 | 变量 *= 表达式 | 双目运算符 | ||
| %= | 取模后赋值 | 变量 %= 表达式 | 双目运算符 | ||
| += | 加后赋值 | 变量 += 表达式 | 双目运算符 | ||
| -= | 减后赋值 | 变量 -= 表达式 | 双目运算符 | ||
| <<= | 左移后赋值 | 变量 <<= 表达式 | 双目运算符 | ||
| >>= | 右移后赋值 | 变量 >>= 表达式 | 双目运算符 | ||
| &= | 按位与后赋值 | 变量 &= 表达式 | 双目运算符 | ||
| ^= | 按位异或后赋值 | 变量 ^= 表达式 | 双目运算符 | ||
| |= | 按位或后赋值 | 变量 |= 表达式 | 双目运算符 | ||
| 15 | , | 逗号运算符 | 表达式1,表达式2,表达式3,… | 左到右 → |
5. 类型转换
当一个运算符的几个操作数类型不同时,编译器需要将它们转换为共同的某种数据类型,才能进行运算。
#include <stdio.h>
int main()
{
printf("整型输出:%d\n",1+2.0);//0
printf("浮点型输出:%f\n",1+2.0);//3.000000
return 0;
}
通常情况下,编译器会将占用坑位比较小的操作数,先转换为与坑位较大的操作数的相同类型,然后再进行运算。这样做的目的就是为了确保计算的精确度。
除了编译器帮你自动转换不同类型的操作数之外,C 语言还允许你强制转换操作数的数据类型。做法就是在操作数的前边用小括号将目标数据类型括起来。
#include <stdio.h>
int main()
{
printf("整型输出:%d\n",1+(int)2.0);//整型输出:3
printf("浮点型输出:%f\n",1+2.0);//浮点型输出:3.000000
printf("整型输出:%d\n",1+(int)1.8);//整型输出:2
printf("整型输出:%d\n",1+(int)0.8);//整型输出:1
return 0;
}
2. 关系运算符和逻辑运算符
1. 关系运算符
在 C 语言中,使用关系运算符来比较两个数的大小关系。

关系运算符都是双目运算符,其结合性均为左到右。另外,关系运算符的优先级低于算术运算符,高于赋值运算符。
2. 关系表达式
用关系运算符将两边的变量、数据或表达式连接起来,称之为关系表达式:
- 1 < 2 // 1
- a > b // 看具体变量
- a <= 1 + b // 看具体变量
- 'a' + 'b' <= 'c' //97+98 <= 99 ----->0
- (a = 3) > (b = 5) // 0
关系表达式得到的值是一个逻辑值,即判断结果为“真”或“假”,如果结果为“真”,关系表达式的值为 1,如果为“假”,关系表达式的值则为 0。
#include <stdio.h>
int main()
{
int a = 5,b = 3;
printf("%d\n",1<2);
printf("%d\n",a>b);
printf("%d\n",a<=b+1);
printf("%d\n",'a'+'b'<='c');
printf("%d\n",(a=3)>(b=5));
// 1
// 1
// 0
// 0
// 0
return 0;
}
3. 逻辑运算符
C 语言总共提供了三种逻辑运算符:

4. 逻辑表达式
用逻辑运算符将两边的变量、数据或表达式连接起来,称之为逻辑表达式:
- 3 > 1 && 1 < 2
- 3 + 1 || 2 == 0
- !(a + b)
- !0 + 1 < 1 || !(3 + 4)
- 'a' - 'b' && 'c'
注:关系表达式和逻辑表达式得到的值都是一个逻辑值,也就是表示真的 1 和表示假的 0。但是用于判断一个值是否为真时,以 0 表示假,以任何非 0 的数表示真。一个是编译系统告诉我们的结果,一个是我们让编译系统去判断的,两者方向不同。
#include <stdio.h>
int main()
{
int a = 5,b = 3;
printf("%d\n",3 > 1 && 1 < 2);
printf("%d\n",3 + 1 || 2 == 0);
printf("%d\n",!(a + b));
printf("%d\n",!0 + 1 < 1 || !(3 + 4));
printf("%d\n",'a' - 'b' && 'c');
// 1
// 1
// 0
// 0
// 1
return 0;
}
5. 短路求值
短路求值又称最小化求值,是一种逻辑运算符的求值策略。只有当第一个运算数的值无法确定逻辑运算的结果时,才对第二个运算数进行求值。
C 语言对于逻辑与和逻辑或采用短路求值的方式。
#include <stdio.h>
int main()
{
int a = 3, b = 3;
int i = 0, j = 0,m = 0,n = 0,l = 0;
i=(a = 0) && (b = 5);
printf("%d\n",i);
printf("a = %d, b = %d\n", a, b);
j=(a = 1) && (b = 5);
printf("%d\n",j);
printf("a = %d, b = %d\n", a, b);
m=(a = 2) || (b = 6);
printf("%d\n",m);
printf("a = %d, b = %d\n", a, b);
l=(a = 0) || (b = 6);
printf("%d\n",l);
printf("a = %d, b = %d\n", a, b);
n=(a = 0) || (b = 0);
printf("%d\n",n);
printf("a = %d, b = %d\n", a, b);
return 0;
}


浙公网安备 33010602011771号