C语言入门与进阶(三)运算符

Naseele c/c++ 17 次阅读 1921 字 预计阅读时间: 9 分钟 发布于 2023-10-17 最后更新于 16 天前


AI 摘要

哈喽!这篇C语言教程就像一本“运算符武功秘籍”,带你解锁编程中的各种运算招式!从基础的加减乘除到神秘的取模运算(比如10%3=1),再到关系、逻辑运算符(与或非就像判断题小帮手)。还有自增自减的“先出手还是后出手”区别,甚至教你用二进制视角玩转位运算(左移右移就像数字搬家哦)。最后附上优先级表,帮你理清运算顺序!快来一起修炼吧~✨

1. 算术运算符

+ 减 - 乘 * 除 / 这些常用的运算符不再赘述,这里单独说一下取模运算符 %:它的作用是取整型变量的余数,比如 10 \ % 3 (数学公式写法为 10 \ b mod 3 ) 等于 1 ,因为 10 除以 3 的余数为 1。

2. 关系运算符

等于 == 不等于 !=  大于 > 小于 < 大于等于 >= 小于等于 <=

3. 逻辑运算符

逻辑与 && 逻辑或 || 逻辑非 !

这三个运算符跟高中数学第一章的运算符类似,"逻辑与"类似"且","逻辑或"类似"或"。依然满足"一真或为真,一假且为假"。

有的人可能没听过这个口诀,没关系,我们展开讲讲: 逻辑与 && 连接两个表达式【1】,如果两个表达式都为 ,则结果为 ,否则为 。 逻辑或 || 连接两个表达式,如果两个表达式都为 ,则结果为 ,否则为 。 逻辑非 ! 将一个表达式取反,如果表达式为 ,则结果为 ,否则为

这些表达式可以嵌套使用【2】,比如 (!(5 == (3 + (6 == 8||9 == 9) == 9)))||(7 == ((7 > 6) ? 7 : 9)) 算出来了吗?没算出来也不用灰心(毕竟正常人都不会这么写),答案是

我们可以借助程序来验证一下:

//输出结果是1,在c语言中0代表假(false),其他值代表真(true)
printf("%d\n",(!(5 == (3 + (6 == 8||9 == 9) == 9)))||(7 == ((7 > 6) ? 7 : 9)));

4. 赋值运算符

  • = 基本的赋值运算符【3】,将等号右边的值赋给等号左边的变量。
  • +=-= a += ba = a + b 的简写,a -= ba = a - b 的简写,*=/= 同理。
  • %= a %= ba = a % b 的简写。

5. 其他运算符

5.1 自增/自减

++ -- 运算符用于自增自减,而且每次只自增或者自减 1

要注意b=a++ 和 b=++a 的区别:
b=++a 表示 a 先自增 1,然后再把自增后的值赋值给 b;
b=a++ 表示先把 a 的值赋给 b,a 再自增 1(自增号在前面先自增,自增号在后面后自增)。

5.2 三目运算符

//如果num1大于num2,则a=num1,否则a=num2
int a = (num1 > num2) ? num1 : num2;

5.3 强制类型转换

在常量或变量前面加上 (类型),强行将其转换为指定的类型。

int a = 9;
//将int类型的a强制转换为long long类型,并将其赋值给long long类型的b
long long b = (long long)a;

5.4 逗号运算符

从左到右依次计算表达式,然后返回最右边表达式的结果。 所有表达式除了最后一个表达式的结果都会被丢弃。 逗号运算符【4】的优先级是最低的,所以它会在所有其他运算符之后执行。

#include<stdio.h>
int main(){
   int a = 7;
   int b = 9;
   printf("%d",(((((++a,b++),a++),++b),a++),++b));//输出12
   //猛一看很复杂,但是只要知道逗号表达式的运算规则就好理解了(只保留最右边表达式的结果),一层一层拆括号即可
   //另外如果你忘了a++和++a的区别了,我们就再来复习一下,++a是a的数值先加1 再拿a的值进行运算,a++是先取走a的值运算,然后再把a本身的值加1
   return 0;
}

6. 位运算符

这个稍微有点复杂,我们一点一点展开讲。

(1) 什么是位

我们之前常说一个数有"几位",比如 1234 有4位,而 12345 有5位。这个位跟我们要说的位是同一个东西。 在计算机术语中,位(bit)【5】来自英文 bit ,音译为“比特”,是计算机内部数据储存的最小单位。 计算机中还有一个单位是字节【6】,一个字节是 8 个比特,也就是八位数。 在计算机中,所有的数字都是以二进制【7】的形式存储的,比如 1234 的二进制是 10011010010 ,是 11 位数。

(2) 十进制转二进制

十进制与二进制相互转换的方法高中学过,但是相信不少同学跟我一样,高考之后就忘得七七八八了(bushi),所以我们来简单复习一下进制转换的方法:

:::info 转换方法 (如果这部分你已经掌握了,可以直接跳到位运算符【8】)

将十进制数除以 2 ,记下余数。拿商接着除以 2,记下余数。重复这个过程,直到商为 0 为止。把刚才一个个记下的余数从后往前读,就是二进制数。 :::

光说有点抽象,我们来看个示例:


刚才只讲了整数,现在说说带小数的十进制数:

:::info 转换方法 把带小数的十进制数分成整数部分和小数部分,整数部分依然用刚才的方法,小数部分不断乘 2,然后取整数部分(是 0 就取 0),之后把乘积的小数部分拿出,乘 2,取整数部分,不断重复这个过程,直到乘积的小数部分为 0 (有可能会出现一直乘下去没完没了的情况,这时候乘 2 取整适当次数就行了,剩下的数直接舍弃)。

注意这次是 从前往后读 你记下来的数字,而不是像整数部分转换时从后往前倒着读 :::

例如:

(3) 二进制转十进制

将二进制数从前往后,每次取出一位,乘以 2^i (i = m - 1) ( m 表示这是原二进制数从前往后数第几个),之后所有乘积相加,就是转换成的十进制数。

比如 10011010010 ,从前往后:

$$
1 * 2^0 + 0 * 2^1 + 1 * 2^2 + 0 * 2^3 + 1 * 2^4 + 1 * 2^5 + 0 * 2^6 + 0 * 2^7 + 0 * 2^8 + 0 * 2^9 + 0 * 2^{10} = 1234
$$

:::info Tips 其实C语言有专门负责进制转换的函数,我们在函数那章再聊,这里先聊原理。 :::

(4) 位运算符

刚才我们聊了位的概念,现在我们来聊一下位运算符。

(4.1) 位左移(<<)与位右移(>>)

位左移 << 是各二进位全部左移若干位,高位丢弃【9】,低位补 0,比如 00100001 左移 2 位,结果就是 10000100 (如果再左移,左边的 1 就会被丢弃)。

位右移 >> 是各二进位全部右移若干位,低位丢弃,高位补 0,比如 00100001 右移 2 位,结果就是 00010000 (如果再右移,右边的 1 可能会被丢弃)。

每位移一次,相当于这个数乘或者除以 2 ,比如 20 的二进制数是 0001 0100 ,左移 3 位,结果就是 1010 0000 ,相当于 20 * 2^3 = 160。

(4.2) <<=和>>=

<<=>>= 这两个运算符跟先前的 +=-= 很像,a >>= b 相当于 a = a >> ba <<= b 相当于 a = a << b

7. 常用运算符优先级

优先级运算符
1()[].->
2!+(正号)-(负号)++--
3*/%
4+(加)-(减)
5<<=>>=
6==!=
7&&
8\|\|
9=+=-=*=/=%=

有些符号我们还没讲到,不着急,先有个大致印象,等后面我们都会一一讲解。

长恨此身非我有,何时忘却营营。
最后更新于 2026-01-17