当前位置:首页 > 技术 > 正文内容

深入理解C语言运算符及其优先级规则

访客 技术 2026年6月17日 1

运算符基础概念

在C语言中,运算符是用于对数据进行特定数学、逻辑或位操作的符号。根据参与运算的操作数数量,运算符可划分为单目(一元)、双目(二元)和三目(三元)运算符。

1. 算术运算符

算术运算符用于执行基本的数学计算。

运算符 描述 目数 运算结果 副作用
+正号单目操作数本身
-负号单目操作数的相反数
+加法双目两数之和
-减法双目两数之差
*乘法双目两数之积
/除法双目两数之商
%取模(取余)双目两数相除的余数
++自增单目前置返回自增后的值,后置返回自增前的值有(修改原变量)
--自减单目前置返回自减后的值,后置返回自减前的值有(修改原变量)

关键注意事项:

  • 取模运算 (%):操作数必须均为整数。运算结果的符号始终与被除数(左侧操作数)的符号保持一致。
  • 副作用要求:产生副作用的运算符(如 ++--)要求其操作数必须是可修改的左值(通常是变量),不能是常量或纯表达式。

2. 关系运算符

关系运算符用于比较两个操作数的大小或相等性,其运算结果始终为 int 类型的 1(真)或 0(假)。

运算符 描述 目数 副作用
==等于双目
!=不等于双目
<小于双目
>大于双目
<=小于等于双目
>=大于等于双目

提示:当有符号整数与无符号整数进行比较时,C语言会将有符号数隐式转换为无符号数,这可能导致负数被解析为极大的正数,从而引发逻辑错误。

3. 逻辑运算符

逻辑运算符用于组合多个布尔条件,结果同样为 10。C语言支持逻辑短路特性,即当左侧操作数足以决定整个表达式的结果时,右侧操作数将不会被计算。

运算符 描述 目数 副作用
&&逻辑与双目
||逻辑或双目
!逻辑非单目

4. 位运算符

位运算符直接对整数在内存中的二进制位进行操作。

运算符 描述 目数 副作用
&按位与双目
|按位或双目
^按位异或双目
~按位取反单目
<<左移双目
>>右移双目

5. 赋值运算符

赋值运算符用于将右侧表达式的值存储到左侧的变量中。其结合性为从右向左。

  • 基本赋值=
  • 复合赋值+=, -=, *=, /=, %=, <<=, >>=, &=, ^=, |=

核心规则:左侧操作数必须是可修改的左值(如变量),右侧可以是常量、变量或复杂表达式。复合赋值运算符 a op= b 在语义上等价于 a = a op (b),但前者只会对 a 求值一次。

6. 条件(三元)运算符

条件运算符是C语言中唯一的三目运算符,提供了一种简洁的条件分支表达方式。

condition ? expression_true : expression_false;

求值逻辑:首先评估 condition。若为真(非零),则执行并返回 expression_true 的结果;若为假(零),则执行并返回 expression_false 的结果。

综合代码示例

#include <stdio.h>

int main() {
    int base_val = 17;
    int divisor = 5;
    
    // 1. 算术与取模运算
    // 结果符号与 base_val 一致,此处为 2
    int mod_result = base_val % divisor; 
    
    // 2. 三元运算符应用
    // base_val > 10 为真,因此 final_val 被赋值为 divisor * 3 (即 15)
    int final_val = (base_val > 10) ? (divisor * 3) : (divisor + 1);
    
    // 3. 逗号运算符与自增副作用
    int counter = 0;
    // 逗号表达式从左到右求值,整个表达式的值为最后一个子表达式的值
    // base_val 先自增变为 18,然后计算 18 * 2,counter 最终为 36
    counter = (base_val++, divisor + 2, base_val * 2); 
    
    printf("Mod: %d, Final: %d, Counter: %d\n", mod_result, final_val, counter);
    return 0;
}

7. 其他常用运算符

  • sizeof:单目运算符,用于获取数据类型或变量在内存中所占的字节数。
  • &:取地址运算符,获取变量在内存中的地址。
  • *:解引用运算符,通过指针访问其指向的内存值。
  • .:结构体成员访问运算符(通过对象实例)。
  • ->:结构体成员访问运算符(通过对象指针)。
  • ,:逗号运算符,按从左到右的顺序计算多个表达式,并返回最右侧表达式的值。

运算符优先级与结合性

在实际开发中,过度依赖运算符的隐式优先级会降低代码的可读性并增加出错概率。建议遵循以下最佳实践:

  1. 显式使用括号:当表达式包含多个不同类型的运算符时,使用 () 明确指定计算顺序。
  2. 拆分复杂表达式:避免编写过长的单行表达式,将其拆分为多个逻辑清晰的中间步骤。
  3. 掌握宏观规律:无需死记硬背完整表格,只需记住总体趋势:单目运算符 > 算术运算符 > 移位运算符 > 关系运算符 > 逻辑/位运算符 > 三元运算符 > 赋值运算符 > 逗号运算符。

优先级参考表

优先级 运算符类别 包含运算符 结合方向
1后缀与成员访问(), [], ->, ., 后置 ++/--从左到右
2单目运算符!, ~, 前置 ++/--, +(正), -(负), *(解引用), &(取地址), sizeof, 强制类型转换从右到左
3乘除与取模*, /, %从左到右
4加减+, -从左到右
5移位<<, >>从左到右
6关系比较<, <=, >, >=从左到右
7相等性判断==, !=从左到右
8按位与&从左到右
9按位异或^从左到右
10按位或|从左到右
11逻辑与&&从左到右
12逻辑或||从左到右
13条件运算符?:从右到左
14赋值与复合赋值=, +=, -=, *=, /=, %=, <<=, >>=, &=, ^=, |=从右到左
15逗号运算符,从左到右

相关文章

Linux crontab 详解

1) crontab 是什么cron 是 Linux 的定时任务守护进程;crontab 是用来编辑/查看“按时间周期执行命令”的表(cron table)。常见两类:用户 crontab:每个用户一份(crontab -e 编辑)系统级 crontab / cron.d:可指定执行用户(/etc/crontab、/etc/cron.d/*)2) crontab 时间...

富文本里可以允许的 HTML 属性

一、所有标签默认允许的安全属性(极少)class        (可选)id           (通常建议禁用)title️ 注意:id 容易被滥用做锚点注入,很多系统直接禁用class 允许的话最好只允许固定前缀(如 editor-*)二、a 标签允许属性<a href="" t...

Mac 安装 Node.js 指南

方法一:通过官网安装包(最简单,适合初学者)如果你只是想快速安装并开始使用,这是最直接的方法。访问 Node.js 官网。页面会显示两个版本:LTS (Recommended For Most Users):长期支持版,最稳定。建议选这个。Current:最新特性版,包含最新功能但可能不够稳定。下载 .pkg 安装包并运行。按照安装向导点击“下一步”即可完成。方法二:使用 Homebrew 安装(...

Dom\HTML_NO_DEFAULT_NS 的副作用:自动加闭合标签

在使用Dom\HTMLDocument时,Dom\HTML_NO_DEFAULT_NS 将禁止在解析过程中设置元素的命名空间, 此设置是为了与DOMDocument向后兼容而存在的。当使用它时,已知的一个副作用就是:自动加闭合标签例如 </img> 为什么会这样?当你使用:Dom\HTML_NO_DEFAULT_NS文档会变成 无命名空间模式,此时内部更接近 XML...

Laravel 事件和监听器创建

在 Laravel 中,使用 Artisan 命令创建 Events(事件) 和 Listeners(监听器) 是非常高效的。你可以通过以下几种方式来实现:1. 手动创建单个 Event如果你只想创建一个事件类,可以使用 make:event 命令:Bashphp artisan make:event UserRegistered执行后,文件将生成在 app/Even...

自定义域名解析神器 dnsmasq

什么是 dnsmasq?dnsmasq 是一个轻量级、功能强大的网络服务工具,专为小型和中等规模网络设计。它是一个综合的网络基础设施解决方案[1]。dnsmasq 能做什么?功能说明应用场景DNS 转发与缓存将 DNS 查询转发到上游服务器(ISP、Google DNS 等),并在本地缓存结果加快 DNS 查询速度,减少外部 DNS 流量本地 DNS解析本地网络设备的主机名,无需编辑&n...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。