7. 【C语言】数据的操盘手:运算符大全

发布时间:2026/7/5 14:58:22
7. 【C语言】数据的操盘手:运算符大全 变量把数据存起来输入输出让数据流起来。但程序真正干活的部分是把存进来的数据拿去做运算——加减乘除、比较大小、判断真假、甚至摆弄二进制位。这些动作全都靠运算符来完成。运算符就是 C 语言里的“操盘手”它们决定数据怎么变关系怎么判逻辑怎么走。今天这篇文章我们就一次把 C 语言常用的运算符认全。不用担心记不住你可以把它当作“速查手册”用到的时候回来看一看就行。一、算术运算符最基本的加减乘除C 语言提供了五种基本算术运算符运算符含义示例结果假设 a10, b3加法a b13-减法a - b7*乘法a * b30/除法a / b3注意%取模求余数a % b1最需要注意的就是除法/。两个整数相除结果一定是整数小数部分直接丢弃不是四舍五入。所以10 / 3得到35 / 6得到0。要想得到小数结果至少让其中一个操作数变成浮点数inta10,b3;printf(%d\n,a/b);// 3printf(%f\n,10.0/3);// 3.333333printf(%f\n,(double)a/b);// 3.333333取模运算符%只能用于整数C99 之前要求整数结果是相除后的余数。取模的符号与被除数相同-10 % 3结果是-1。另外C 语言没有幂运算符^不是幂是位运算计算次方要用库函数pow在math.h里。二、赋值与复合赋值让等号更强大赋值运算符就是等号。它的意思是“把右边表达式的值放进左边的变量里”。intx;x53;// x 变成 8注意等号不是数学里的“相等”而是“赋予”。你可以连续赋值inta,b,c;abc0;// 从右往左三个变量都变成 0为了写起来更简洁C 还提供了复合赋值运算符。它们把运算和赋值合二为一运算符等价于x 5x x 5x - 5x x - 5x * 5x x * 5x / 5x x / 5x % 5x x % 5后面的位运算也有对应的复合赋值如、|、^等。这些写法不光是少敲几个字有时也能让编译器生成更高效的代码特别是对早期编译器而言。三、自增自减和--让变量加 1--让变量减 1。它们既可以放在变量前面前缀也可以放在后面后缀但行为有微妙差别。前缀先加/减再使用变量的值。后缀先使用变量的当前值再加/减。看例子inta5,b;ba;// 先 a 变成 6再赋给 b所以 b6, a6inta5,b;ba;// 先 b 取 a 的值 5再 a 变成 6所以 b5, a6如果单独写一行a;或a;效果一样。区别只在它们和“取值”动作合并在一个表达式里时才显现。避坑指南不要在一个表达式里多次修改同一个变量并取值比如c a a;这种代码的结果是未定义的不同编译器可能得出不同结果绝不要这样写。四、关系运算符比大小判真假关系运算符用来比较两个值结果是1真或0假。C 语言里没有真正的“布尔”类型C99 有_Bool后面会提到真假直接用整数表示。运算符含义示例a5, b3结果等于a b0!不等于a ! b1大于a b1小于a b0大于等于a 51小于等于a 40最常见的错误就是把相等写成赋值。if (a 5)永远为真因为赋值表达式的值就是 5非零即真这会导致极难发现的逻辑 bug。比较相等务必用双等号。五、逻辑运算符拼装条件逻辑运算符用来连接多个关系表达式构造复杂的判断条件。运算符含义示例结果逻辑与并且(a 2) (b 10)两边都真才为真逻辑或或者!逻辑非取反!(a 2)真变假假变真逻辑运算符有一个非常重要的特性——短路求值对于A B如果 A 已经是假B 根本就不会计算。对于A || B如果 A 已经是真B 同样不会计算。这个特性常常被用来安全地编写代码比如int*pNULL;if(p!NULL*p10){// p 为空时不会去读 *p避免了崩溃printf(ok\n);}逻辑非!可以把非零值变成 00 变成 1。!5的结果是 0。六、位运算符初探直接玩转二进制位运算符是对数据的二进制位进行操作的。它们是 C 语言高效和贴近硬件的体现在嵌入式、系统编程和性能敏感的场景里非常有用。我们暂时只做感性了解后面会有专门的文章深入。运算符含义示例a5即0101b3即0011结果按位与a b(0101 0011)1 (0001)按位或a^按位异或a ^ b6 (0110)~按位取反~a取决于位数对于8位是 11111010左移a 110 (1010)右移a 12 (0010)与两位都是 1 结果才为 1常用来“屏蔽”某些位。或|任一位是 1 结果就为 1用来“置位”。异或^两位不同为 1相同为 0用于切换位或简单加密。取反~所有位翻转0 变 11 变 0。移位左移一位相当于乘 2右移一位相当于除 2对正整数来说。注意位运算符操作的是整型不要弄混和、|和||它们是完全不同的东西。七、其他你可能遇到的运算符1. 条件运算符三目运算符条件 ? 表达式1 : 表达式2如果条件为真计算并返回表达式1否则返回表达式2。intmax(ab)?a:b;它相当于if-else的简写形式适合简单的二选一赋值。2. 逗号运算符,可以连接多个表达式整个表达式的值是最后一个表达式的值。它主要在for循环里用后面会见到intx,y;x(y3,y2);// y 被赋为 3然后 x 得到 5日常写代码尽量不要滥用它会让可读性变差。3.sizeof运算符我们之前已经见过用来获取类型或变量的大小编译时计算。它也是运算符不是函数。八、运算符优先级与结合性速查当你在一行里写多个运算符时谁先算谁后算规则就是优先级。如果优先级相同结合性决定从左往右还是从右往左。一个典型例子a b * c先算*再算因为乘除优先级高于加减。优先级简表从高到低同一行优先级相同优先级运算符结合性1()[].-左到右2!~--(正)-(负)*(解引用)(取地址)(类型)sizeof右到左3*/%左到右4-左到右5左到右6左到右7!左到右8(按位与)左到右9^左到右1011左到右1213?:右到左14-等右到左15,左到右不用死记硬背建议多用括号。括号的优先级最高而且能让意图一目了然比依赖默认优先级安全得多。九、常见陷阱集合整数除法截断double half 1 / 2;→half是 0.0。应改为1.0 / 2或强制类型转换。把写成if (a 5)恒为真。可以把常量写在左边if (5 a)这样如果漏写一个会编译错误。自增的副作用int x a a;是未定义行为不同编译器结果不同绝不要写。位运算与逻辑运算混淆和、|和||绝不等价。if (a b)是按位与如果 a 和 b 是 0 或 1 可能碰巧对但多数情况下语义错误。对浮点数用%3.14 % 2非法取模只能用于整数。优先级导致意外*p是*(p)而不是(*p)因为后缀优先级高于解引用*。同样多用括号避免这类头疼问题。十、小结今天一口气认识了算术、赋值、自增自减、关系、逻辑、位运算、条件、逗号等 C 语言运算符了解了优先级和结合性的基本规则。这些运算符就是程序的“动词”它们决定了数据如何被操纵、条件如何判断、逻辑如何组织。下一步我们要用这些运算符来指挥程序的走向——分支结构来了。if、else、switch让代码在不同条件下走不同的路程序从此有了“判断力”。课后小练习写程序输入一个三位整数比如 367输出它的个位、十位、百位数字。提示善用/和%。声明两个变量a10, b20通过加减法和异或运算两种方法在不使用第三个变量的情况下交换它们的值并打印交换前后的结果。用条件运算符?:实现输入一个整数输出它的绝对值。试试写一行代码int x 5; printf(%d\n, x x);用不同编译器试试看结果是否一致再决定永远不要写这样的代码。我们下期见获取本系列示例代码请访问 GitCode 仓库。