C++中的运算符和计算顺序

本文详细介绍了C++中的运算符优先级及其结合律,解释了左值和右值的概念,并讨论了表达式的求值顺序。对于理解C++语言的基础语法至关重要。
C++中的运算符和计算顺序
1.运算符和其优先级
 
优先级
运算符
结合律
 
 
 
 
 
 
 
( ) [ ] -> .
从左至右
! ~ ++ -- (类型) sizeof + - * &
从右至左
* / %
从左至右
+ -
从左至右
<< >>
从左至右
<   <=   > >=
从左至右
== !=
从左至右
&
从左至右
^
从左至右
|
从左至右
&&
从左至右
||
从右至左
?:
从右至左
= += -= *= /= %= &= ^= |= <<= >>=
从左至右
      

 

      

   在C++程序设计语言中说 ++的后增(减)量(lvalue++)的优先级大于*。前增(减)量(++lvalue)*的优先级相同。

       *p++的意思是*(p++),不是(*p)++

       这样区别来对待前增量和后增量:y=++x相当于y=(x+=1),而y=x++相当于y=(t,x+=1,t)这样的区别看起来相当不错。

2.什么是左值?
       左值(lvalue)是可以被赋值的表达式。左值位于赋值语句的左侧,以其相对的右值(rvaule,则位于赋值语句的右侧。每条赋值语句都必须有一个左值和一个右值。左值必须是内存中一个可存储的变量,而不能是一个常量。
       左值能够存储表达式的结果:++x的结果存储在x中所以它是左值。x++的结果不是放在x中的值,所以它不是左值。
       右值是不可取址的,如常量,函数返回值,类型转换结果;
       int& u(); 它返回的是左值,(a=4)=28; //a=4是左值表达式。
3.求值顺序
       在一个表达式里,子表达式的求值顺序是没有定义的。特别的是,你不能假定表达式从左向右求值。 int x=f(3)+g(7) 没有定义 f(),g()哪个先调用。
int i=1; v[i]=i++;
结果也是没有定义的或者是v[1]=1,或者是v[2]=1。
但是有三种运算符的计算顺序是有定义的:逗号(,),逻辑与(&&),逻辑或(| |)。它们保证了左边的运算对象一定要先于右边的运算对象计算。如:b=(a=2,a++)计算后把3赋给b。&&只有在第一个运算对象为true时才算第二个。| |只有在第一个运算对象是false时才算第二个,这叫短路求值
注意区分逗号的两种用法:
f1(v[i],i++)     两个参数;
f2( (v[i],i++) )   逗号表达式;
对于f2来说参数只有一个相当于i++。
### C++ 中逻辑运算符的优先级运算顺序C++ 编程语言中,逻辑运算符用于处理布尔值(`true` 或 `false`),并返回相应的布尔结果。以下是关于 C++ 逻辑运算符的相关说明: #### 1. 逻辑运算符及其描述 C++ 提供了三种主要的逻辑运算符: - **逻辑非 (`!`):** 单目运算符,取反操作。如果其操作数为真,则结果为假;反之亦然[^2]。 - **逻辑与 (`&&`):** 双目运算符,当两个操作数都为真时,结果才为真。 - **逻辑或 (`||`):** 双目运算符,只要有一个操作数为真,结果就为真。 #### 2. 逻辑运算符的优先级 根据提供的参考资料,可以总结出以下逻辑运算符的优先级关系(从高到低): - **`!`(逻辑非)** 的优先级高于其他逻辑运算符[^3]。 - 接下来是 **`&&`(逻辑与)**。 - 最后是 **`||`(逻辑或)**。 这意味着,在一个未加括号的复杂表达式中,`!` 将最先被计算,接着是 `&&`,最后才是 `||`。 #### 3. 结合性运算顺序 除了优先级之外,还需要考虑结合性来进一步明确运算顺序: - 所有逻辑运算符均遵循左结合律,即对于同级别的运算符,会按照从左至右的方向依次求值。 例如,在表达式 `(a || b && c)` 中: - 首先由于 `&&` 的优先级较高于 `||`,因此子表达式 `b && c` 被先行评估; - 然后再将此结果与 `a` 使用 `||` 进行组合得出最终的结果。 #### 示例代码展示 为了更直观理解上述规则的应用场景,请看如下例子: ```cpp #include <iostream> using namespace std; int main() { bool a = true; bool b = false; bool c = true; // 表达式 (a || !b && c) if(a || !b && c){ cout << "条件成立!" << endl; }else{ cout << "条件不成立!" << endl; } return 0; } ``` 在这个程序里,因为 `!` 的优先级最高,所以它会被第一个应用去改变变量 `b` 的状态;之后再依据次序完成剩余部分的操作。 #### 注意事项 尽管知道每种运算符的确切位置很重要,但在实际编码过程中推荐通过显式添加圆括号的方式来增强可读性减少潜在错误风险。 ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值