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=210/3=33/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=37%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=20
    • int 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=2
      • cout << (3>5)+10;0+10=10
      • int 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<c5<4=00<3=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=3
    • cout << (X=3, X++, ++X); → 执行顺序X=3→4→5,输出5
    • cout << (3,2); → 输出2,不是3和2
    • cout << (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. 表达式结果类型判断

表达式类型结果类型示例
纯整数算术表达式int1+2*3=7(int)
含浮点数算术表达式double1+2*3.0=7.0(double)
关系/逻辑表达式int(0或1)3>2=13&&2=1
带字符的算式intcout << 'a' + 1; 输出98 不是b,字符运算默认得到整数

2. 表达式隐式转换

  • 任何整数/浮点数转布尔:0→false,非0→true
  • 布尔转整数:false→0true→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

九、特殊应用场景

  1. 提取数字各位

    • 个位:N%10
    • 百位:N/100%10N%1000/100
    • 去掉个位:N = N/10
  2. 镜面数(逆序)

    while(N != 0){ // 等价于N>0 或 not(N==0)
        rst = rst*10 + N%10;
        N = N/10;
    }
  3. 条件判断

    • 能被3整除的偶数:N%2==0 && N%3==0
    • 奇因数:N%i==0 && i%2==1

十、经典判断

说法对错说明
10*4%610*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.124X=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=00<3=1,结果为真
!!N 的值等于NN经过两次取反,结果会是1或者0,不一定恢复原始数字
8/38%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/410%4 可以互相替换结果都是2,但意义完全不同
n=27 时,cout<<n%10 输出7取个位

十一、经典计算

  1. (3-2)*3+5 → 8
  2. 3-3*3/5 → 2
  3. N%3 + N%7 最大值 → 8
  4. (X=3,X++,++X) → 5
  5. 12-3*2 &&2 → 1
  6. 10-3*2 →4
  7. 2+3*4%5 →4
  8. 3*4%5/6 →0
  9. 14-3*3%2 →13
  10. 9/4 -6%(6-2)*10 →-18
  11. int a=16; ++a+=3 →20
  12. 16/4%2 →0
  13. (6>2)*2 →2
  14. for(int i=1;i<10;i++) cnt+=i++ →25
  15. for(i=0,s=0;i<20;i++,count++) s+=i++ →s=90,count=10
  16. 100/200*200 →0
  17. (3&&5)+2 →3
  18. !5+10 →10

标签: none

评论已关闭