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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)