[C++高频精进] 语法与数据结构:运算符与表达式

核心要点速览

  • 逻辑运算符(&&/||):支持短路求值,右操作数可能不执行
  • 逗号运算符(,):按左到右执行多个表达式,返回最后一个值,优先级最低
  • 右结合运算符:赋值运算符(=)、条件运算符(?:)、单目运算符,优先级相同时从右到左执行

一、逻辑运算符的短路求值(&& / ||)

核心规则

短路求值是逻辑运算符的优化特性,仅在必要时计算右操作数,直接影响代码执行结果。

  1. &&(逻辑与):左操作数为false时,直接返回false右操作数不执行
  2. ||(逻辑或):左操作数为true时,直接返回true右操作数不执行

常见场景(含副作用表达式)

  • &&短路示例:

    int i = 0;
    bool res = (i == 1) && (++i); // 左为false,右++i不执行
    // 结果:res=false,i=0(而非1)
    
  • ||短路示例:

    int j = 0;
    bool res = (j == 0) || (++j); // 左为true,右++j不执行
    // 结果:res=true,j=0(而非1)
    

易错点

  • 禁止将 “必须执行的代码”(如变量更新、数据写入)放在短路运算符右侧,可能因短路导致逻辑失效。
  • 区分&&/||(有短路特性)与&/|(按位运算,无短路,左右操作数均执行)。

二、逗号运算符(,)

核心规则

  • 执行顺序:按从左到右依次执行所有表达式。
  • 返回值:最终返回最后一个表达式的值
  • 优先级:C++ 中优先级最低(低于赋值运算符),需用括号明确执行逻辑。

典型场景(含陷阱)

  1. 优先级陷阱(与赋值结合):
int a = 1, 2; // 错误:等价于(a=1),2,赋值语句不合法
int a = (1, 2); // 正确:返回最后一个表达式,a=2
  1. for 循环多操作场景:
for (int i=0, j=5; i<5; i++, j--) { ... }
// 初始化:i=0和j=5同时执行;更新:i++和j--按顺序执行

考察点

  • 考察 “返回最后一个表达式值”,常结合赋值语句预判结果。
  • 区分 “变量声明中的逗号”(非运算符),如int a, b;是声明两个变量,并非逗号运算符。

三、右结合运算符(优先级相同时的执行顺序)

概念

结合性指 “多个优先级相同的运算符连续出现时的执行顺序”,C++ 中多数运算符为左结合,仅以下三类为右结合。

三类右结合运算符

1. 赋值运算符(=)
  • 规则:从右到左执行,支持链式赋值。

  • 示例:

    int a, b, c;
    a = b = c = 5; // 右结合:先c=5 → 再b=c → 最后a=b,结果a=b=c=5
    
  • 易错点:a = 3, 4等价于(a=3),4,a 的值为 3(非 4),因逗号运算符优先级更低。

2. 条件运算符(?:)
  • 规则:唯一的右结合双目运算符,嵌套时从右向左解析。
  • 嵌套示例:
    int x=1, y=2, z=3;
    int res = x>y ? x : y>z ? y : z; // 等价于x>y ? x : (y>z ? y : z)
    // 结果:res=3(y>z为false,取z=3)
    
3. 单目运算符
  • 包含:前缀++、前缀--*(解引用)、&(取地址)、!~+(正)、-(负)、sizeof等。

  • 规则:从右到左执行,常结合指针操作考察。

  • 指针示例:

    int a=5;
    int* p=&a;
    ++*p; // 右结合:先*p(取a=5)→ 再++,结果a=6
    
  • 易错点:区分前缀(右结合)和后缀++/--(左结合),如*p++是左结合,先*pp++

四、表达式求值的核心规则

表达式的求值结果由两大因素决定,这也是理解复杂表达式的关键:

  1. 运算符优先级:决定不同运算符的执行顺序(如*优先级高于+)。
  2. 结合性:当多个优先级相同的运算符连续出现时,决定执行顺序(左结合 / 右结合,如前文的右结合运算符)。

示例:综合优先级与结合性

int a = 2, b = 3, c = 4;
int res = a + b * c / 2; 
// 优先级:*、/ 高于 +,且 * 和 / 左结合 → 先算 b*c=12,再 12/2=6,最后 a+6=8 → res=8
int x = 10, y = 20;
bool flag = x > 5 || y++ > 15; 
// 优先级:> 高于 ||;|| 短路求值 → 左操作数x>5为true,右操作数y++不执行 → flag=true,y=20

五、表达式的 “副作用”

表达式在求值过程中,若修改了操作数的值(如++--、赋值),则产生 “副作用”。副作用可能导致表达式求值结果依赖执行顺序,需特别注意:

int i = 1;
int res = i++ + i++; 
// 未定义行为!C++标准未规定两个i++的执行顺序,不同编译器可能返回2(先算左再右)或3(先右再左)

规则:避免在同一表达式中对同一变量进行多次修改(如i++ + i++),此类代码行为未定义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值