学习
错题
模考
我的
登录/注册/忘记密码
学习 / 顺序结构 / 运算符
运算符
加减乘除、取余、类型转换、位运算扩展、优先级
1. 加减乘除
先会四则运算就够日常写程序。它们和算术里的加、减、乘、除一一对应。 | 运算符 | 含义 | 例子 | 结果 | | --- | --- | --- | --- | | `+` | 加 | `3 + 2` | `5` | | `-` | 减 | `3 - 2` | `1` | | `*` | 乘 | `3 * 2` | `6` | | `/` | 除 | `6 / 2` | `3` | 两边都是整数时,`/` 是**整除**,小数部分直接丢掉: ```c int a = 5 / 2; /* 结果是 2,不是 2.5 */ int b = 5 / 2.0; /* 有一边是小数,结果按浮点算,是 2.5 */ ``` `+` `-` `*` `/` 还可以写成 `+=` `-=` `*=` `/=`,表示「用自己再算一遍再存回去」,例如 `n = n + 1` 就是 `n += 1`。
2. 取余
`%` 叫**取余运算符**,作用就一件事:求出整除之后剩下的余数。 ```c int r = 7 % 3; /* 7 = 3*2 + 1,所以 r 是 1 */ int s = 8 % 2; /* 正好整除,余数是 0 */ ``` 记住: - 只对**整数**做 `%`。不要写 `3.5 % 2`。 - 余数的正负号,教学里按「和被除数同号」来记即可。 - 常见用法:`n % 2 == 0` 表示偶数;`n % 10` 取出个位数字。
3. 自动类型转换与强制类型转换
不同类型出现在同一个式子里时,C 会先把它们变成同一种类型,再运算。这叫**自动类型转换**。想自己指定变成哪种类型,就用**强制类型转换**。 **1. 自动类型转换** 常见规则(从「小」往「大」靠): - 整数和小数一起算 → 按小数算(`int` 会变成 `double` / `float`) - 赋值时:右边先算完,再转成左边变量的类型 ```c int a = 5; double x = a + 0.5; /* a 先变成 5.0,x 是 5.5 */ int n = 3.9; /* 赋给 int,小数部分丢掉,n 是 3 */ ``` 注意:式子里如果**两边都还是整数**,除法仍按整除,不会因为「最后要存进 double」就自动变成小数除: ```c int a = 5, b = 2; double x = a / b; /* 先算出整数 2,再变成 2.0,不是 2.5 */ ``` **2. 强制类型转换** 写法:`(类型)表达式`。只改变后面紧挨着的那一块。 ```c int a = 5, b = 2; double y = (double)a / b; /* 先把 a 变成 5.0,再除,y 是 2.5 */ int m = (int)3.9; /* m 是 3,不是四舍五入成 4 */ ``` 括号位置很重要: ```c (double)(a / b) /* 仍先整除,得到 2.0 */ (double)a / b /* 先转换 a,得到 2.5 */ ``` 记住: - 转成 `int` 是截断,不是四舍五入。 - 想做小数除法,至少让 `/` 的一边先变成小数。 - 拿不准时写成 `(double)a / b` 或 `a / 2.0`。
4. 位运算(扩展)
位运算按二进制的每一位来算,专升本里当作**扩展**即可:先知道规则,再记两个最常见的用法。 | 运算符 | 名称 | 规则(对每一位) | | --- | --- | --- | | `&` | 按位与 | 两个都是 1 才是 1 | | `\|` | 按位或 | 有一个是 1 就是 1 | | `^` | 按位异或 | 两个不同才是 1 | | `~` | 按位取反 | 0 变 1,1 变 0 | | `<<` | 左移 | 整体向左移,右边补 0 | | `>>` | 右移 | 整体向右移(正数左边补 0) | ```c /* 5 是 0101,1 是 0001 */ 5 & 1 /* 0001,结果 1 */ 5 | 1 /* 0101,结果 5 */ 5 ^ 1 /* 0100,结果 4 */ 5 << 1 /* 1010,结果 10,相当于乘 2 */ 5 >> 1 /* 0010,结果 2,相当于除 2 取整 */ ``` 常见用法就记这两类: - **看某一位**:`n & 1` 能看出最低位。结果是 1 就是奇数,是 0 就是偶数。 - **乘、除 2 的幂**:`n << k` 相当于 `n` 乘以 2 的 k 次方;`n >> k` 相当于整除 2 的 k 次方。只对非负整数这样记。 其余「置位、清位」考试里少见,用到再查。
5. 运算符优先级
一串式子里有好几个运算符时,要先知道**谁先算**。和算术一样:先乘除,后加减;想改变顺序,加括号。 下面按「越靠上越先算」来记。同一行里的,一般从左往右。 | 优先级(高 → 低) | 运算符 | 结合方向 | | --- | --- | --- | | 最高 | `()` | 括号里的先算 | | 很高 | `++` `--` `!` `~` 正负号 | 从右往左 | | 高 | `*` `/` `%` | 从左往右 | | | `+` `-` | 从左往右 | | | `<<` `>>` | 从左往右 | | 中 | `<` `>` `<=` `>=` | 从左往右 | | | `==` `!=` | 从左往右 | | | `&` | 从左往右 | | | `^` | 从左往右 | | | `\|` | 从左往右 | | | `&&` | 从左往右 | | | `\|\|` | 从左往右 | | 低 | `?:`(三目) | 从右往左 | | 更低 | `=` `+=` `-=` 等赋值 | 从右往左 | | 最低 | `,`(逗号) | 从左往右 | **1. 先乘除,后加减** ```c int x = 3 + 4 * 5; /* 先 4*5,再加 3,结果 23 */ int y = (3 + 4) * 5; /* 括号抬高优先级,结果 35 */ ``` `*` `/` `%` 同一级,从左往右: ```c int z = 20 / 4 * 2; /* 先 20/4 得 5,再 *2 得 10,不是 20/8 */ ``` **2. 赋值很靠后** ```c int a, b; a = b = 3; /* 先 b=3,再 a=b,两个都是 3 */ ``` 所以 `a = 1 + 2` 一定是先算右边的 `1+2`,再赋给 `a`。 **3. 关系、逻辑比算术更靠后** ```c int n = 3; int t = n > 1 + 1; /* 先算 1+1,再比大小,t 为 1(真) */ ``` `&&` 比 `||` 先算: ```c /* 先算 a && b,再和 c 做 || */ a && b || c ``` **4. 位运算很容易踩优先级** `&` `|` `^` 比 `==` **更靠后**。这是位运算最常见的坑: ```c int n = 5; /* 错:先算 1==0,再拿 n 去 & 这个结果 */ if (n & 1 == 0) { } /* 对:先加括号,先算 n&1 */ if ((n & 1) == 0) { } ``` **5. 记不住就加括号** 优先级表不用全背。考试和写程序时,只要会「乘除在加减前、赋值最后、拿不准就加 `()`」。括号既给编译器看,也给自己看。
开始练习
返回顺序结构
登录
注册
忘记密码
点击此处输入用户名
点击此处输入密码
登录
点击此处输入用户名
点击此处输入密码
点击此处输入邮箱
发送验证码
点击此处输入验证码
点击此处输入邮箱
发送验证码
点击此处输入验证码
点击此处输入新密码