运算符与表达式
GESP三级 运算符与表达式
一、完整运算符优先级(从高到低,必背)
括号() > 自增++/自减-- > 逻辑非! > 乘 / 取模% > 加+ 减- > 关系> < >= <= > 等于== 不等于!= > 逻辑与&& > 逻辑或|| > 三目?: > 赋值= += -= = /= %= > 逗号,
- 口诀:括号自增非乘除,加减关系与或三,赋值逗号最后算
- 易错:逻辑非!优先级远高于关系运算符,
!5>3等价于(!5)>3=0,正确写法是!(5>3)
二、赋值运算符(=、+=、-=、*=、/=、%=)
1. 基础赋值=
- 左值:等号左边只能是变量,绝对不能放常量、算式,能出现在等号左边被赋值的也叫左值。
- 右值:等号右边可以是常量、算式、变量等等,能出现在等号左边被赋值的也叫右值。
- 连等:
a = b = c = d;(从右往左依次赋值) ❌ 绝对错误写法:
3 = a;(左边是常量)a = b = c + d = e;(c+d是算式,不能被赋值)a + b = c;(左边是算式)
2. 复合赋值运算符
- 规则:
a op= b等价于a = a op b - ✅ 合法:
a += b + c(等价于a = a + b + c) - ❌ 非法:
a + b += c(左边是算式)
三、算术运算符(+、-、*、/、%、++、--)
1. 加减乘(无特殊坑,细心计算即可)
2. 除法/(高频)
整数除法:去尾法直接截断小数,不四舍五入
- 例:
9/4=2、10/3=3、3/5=0(小整数除以大整数等于0)
- 例:
不满足交换律:
5/2*2=4(先算5/2=2,再乘2=4)5*2/2=5(先算5*2=10,再除以2=5)
- 混合运算:整数+浮点数→结果为浮点数,如
10/4.0=2.5 - 关于类型区分:常量直接看带不带小数点,变量则看声明时的类型。
3. 取模%(高频)
- 左右两边必须都是整数,出现小数直接编译报错
- 结果范围:
0 ≤ 余数 < 除数的绝对值 - 小整数模大整数=自身:
3%5=3、7%10=7 - 核心应用:多用于整除判断,
a%b==0判断b能整除a;a%2判断奇偶;另a%10可取a的个位数
4. 自增++/自减--(高频难点)
口诀:符号在前,先算后用;符号在后,先用后算
- 后置++:
cout << a++;→ 先输出a原值,再a=a+1 - 前置++:
cout << ++a;→ 先a=a+1,再输出a新值
- 后置++:
❌ 语法错误:
a+++b(编译器解析为a++ +b,但语法不规范,禁止使用)(++X)++(不能对临时值进行自增操作,编译报错)
- ✅ 浮点数支持自增自减:
float x=101; x++; cout<<++x;→ 输出103 示例:
int a=16; ++a +=3;→ 先++a=17,再17+3=20,最终a=20int cnt=0; for(int i=1;i<10;i++) cnt +=i++;→ i取1,3,5,7,9,和为25,加的都是i自增之前的值for(int i=0,s=0;i<20;i++,count++) s+=(++i);→ i取0,2,4……16,18,实际加1,3,5……17,19,求和s=100,加的都是++i自增后的值。
4. 算式做判断⭐⭐⭐⭐⭐
- 算式做判断,算出来是0则为假,算出来任何其他数字都是真,包括负数和小数。
- 固定操作,if里出现算式,算式后面都加个!=0⭐⭐⭐⭐⭐
- 例:
if(a%2 && a%3)为真,则说明a%2和a%3都是真的,等同于判断if(a%2!=0 and a%3!=0)⭐⭐⭐⭐⭐
四、关系运算符(>、<、>=、<=、==、!=)
1. 基础规则
- 结果只能是
0(假)或1(真) 核心考点:关系表达式可以直接参与算术运算⭐⭐⭐⭐⭐
- 原理:关系表达式的结果是整数0或1,因此可以和其他整数进行加减乘除
真题示例:
cout << (6>2)*2;→1*2=2cout << (3>5)+10;→0+10=10int ans = (a==b)*5 + (a>b)*10;
2. 连续比较(高频坑点)
语法合法,但逻辑完全错误,规则:从左到右依次比较,前一个比较的结果(1/0)作为二次比较的数字
- 例1:
5 < 4 < 3→ 先算5<4=0(假),再算0<3=1(结果为真) - 例2:
3 > 2 > 1→ 先算3>2=1(真),再算1>1=0(结果为假) - 例3:
a=5,b=4,c=3时,a<b<c→5<4=0,0<3=1(结果为真)
- 例1:
正确区间写法:
a > b && b > c五、逻辑运算符(!、&&、||)
1. 逻辑非!
真假取反,结合类型转换:只有0为假,非0全为真
- 例:
!0=1、!5=0、!(-3)=0 !a为真,则a必为假,!a等同于判断a==0。- 同理,
!(a%b)等同于判断a%b==0
- 例:
2. 逻辑与&& / 逻辑或||
- 结果只能是
0(假)或1(真) 核心考点:算术表达式可以直接当判断条件⭐⭐⭐⭐⭐
- 原理:C++中,0为假,非0一律为真
等价关系:
if(a%3)等价于if(a%3 != 0)(a不能被3整除)if(b%2)等价于if(b%2 != 0)(b是奇数)if(a%3 && b%2)等价于if( (a不能被3整除) && (b不能被2整除) )
真题示例:
for(int i=0;i<10;i++) if(i%3 && i%7) tnt +=i;→ 累加不能被3且不能被7整除的数if(N%i==0 && i%2) cnt+=i;→ 累加N的所有奇因数
六、逗号运算符(,)
- 规则:从左到右依次执行所有表达式,最终结果为最后一个表达式的值
真题示例:
int a = (1,2,3);→ a=3cout << (X=3, X++, ++X);→ 执行顺序X=3→4→5,输出5cout << (3,2);→ 输出2,不是3和2cout << (x++, y++, x+y);→ x和y都先自增,然后输出x+y的值a, b = 3, 4;→ b获得4,a没有被赋值 ⭐⭐⭐
七、三目运算符(?:)
- 语法:
条件 ? 表达式1 : 表达式2 - 等价于:
if(条件) 表达式1; else 表达式2; - ?前面作为判断关系,:前后各写一个值,判断关系为真则取冒号前面,否则取冒号后面。
- 例如
a = b>c ? d : e,等同于if(b>c) a=d; else a=e;
八、表达式核心规则
1. 表达式结果类型判断
| 表达式类型 | 结果类型 | 示例 |
|---|---|---|
| 纯整数算术表达式 | int | 1+2*3=7(int) |
| 含浮点数算术表达式 | double | 1+2*3.0=7.0(double) |
| 关系/逻辑表达式 | int(0或1) | 3>2=1、3&&2=1 |
| 带字符的算式 | int | cout << 'a' + 1; 输出98 不是b,字符运算默认得到整数 |
2. 表达式隐式转换
- 任何整数/浮点数转布尔:
0→false,非0→true - 布尔转整数:
false→0,true→1 - 字符转整数:用ASCII码,如
'A'=65、'0'=48 - 混合运算自动提升:
bool < int < long long < float < double
3. 特殊表达式计算
算式中嵌入判断:判断成功当1,失败当0
- 例:
ans = 1+0 + (b==c) + 'A',b==c为假→0,结果=1+0+0+65=66
- 例:
九、特殊应用场景
提取数字各位
- 个位:
N%10 - 百位:
N/100%10或N%1000/100 - 去掉个位:
N = N/10
- 个位:
镜面数(逆序)
while(N != 0){ // 等价于N>0 或 not(N==0) rst = rst*10 + N%10; N = N/10; }条件判断
- 能被3整除的偶数:
N%2==0 && N%3==0 - 奇因数:
N%i==0 && i%2==1
- 能被3整除的偶数:
十、经典判断
| 说法 | 对错 | 说明 |
|---|---|---|
10*4%6 和 10*2%3 结果相同 | ✅ | 都是4 |
10%0.5 会报错 | ✅ | 取模只能用于整数 |
N*2%N(N为正整数)结果为2 | ❌ | 结果为0 |
N=5 时,N+!N=4 | ❌ | !5=0,结果为5 |
3<X<5 结果为4 | ❌ | 结果为1(真) |
int X=16.44; cout << X/10; 输出1 | ✅ | 整数除法截断小数 |
N=10 时,N/4->N%4->N/4.0 输出2->2->2.0 | ✅ | 整数除法vs浮点数除法 |
int X=20.24; cout << (X++,X+1)/10; 输出2.124 | ❌ | X=20,结果为22/10=2 |
cout << (3,2); 输出3和2 | ❌ | 输出2 |
N+=8/4/2 等价于 N+=8/(4/2) | ❌ | 等价于N+=(8/4)/2=1 |
a=5,b=4,c=3 时,a<b<c 为假 | ❌ | 5<4=0,0<3=1,结果为真 |
!!N 的值等于N | ❌ | N经过两次取反,结果会是1或者0,不一定恢复原始数字 |
8/3 和 8%3 值相同 | ✅ | 分别为2和2,值相同 |
| 等号左边可以放常量 | ❌ | 只能放变量 |
a = b = c + d 是合法写法 | ✅ | 从右往左赋值 |
5/2*2 等于5 | ❌ | 等于4,整数除法不满足交换律 |
float x; x=101; x++; cout<<++x; 输出103 | ✅ | 浮点数支持自增自减 |
x是double型,cout<<(x?1227:12.27) 会报错 | ❌ | x做判断条件,根据true/false分别接收1227或者12.27,均没有问题 |
10/4 和 10%4 可以互相替换 | ❌ | 结果都是2,但意义完全不同 |
n=27 时,cout<<n%10 输出7 | ✅ | 取个位 |
十一、经典计算
(3-2)*3+5→ 83-3*3/5→ 2N%3 + N%7最大值 → 8(X=3,X++,++X)→ 512-3*2 &&2→ 110-3*2→42+3*4%5→43*4%5/6→014-3*3%2→139/4 -6%(6-2)*10→-18int a=16; ++a+=3→2016/4%2→0(6>2)*2→2for(int i=1;i<10;i++) cnt+=i++→25for(i=0,s=0;i<20;i++,count++) s+=i++→s=90,count=10100/200*200→0(3&&5)+2→3!5+10→10
评论已关闭