CSP-J 运算符优先级专题训练题单
2026/8/26 17:35:14 网站建设 项目流程

本练习共14题,覆盖CSP-J初赛中运算符优先级的全部核心题型。每道题均附有答案详细解析,方便教师讲解或学生自查。


🌟 第一梯队:基础优先级判断(第1-4题)

目标:熟记C++运算符优先级顺序,能判断简单表达式的运算顺序。

第1题★☆☆☆☆
在C++中,下列运算符中优先级最高的是( )。

A.&(按位与) B.&&(逻辑与) C.==(等于) D.+(加法)

答案:D
解析:C++运算符优先级从高到低大致为:算术运算符(+,-,*,/,%) > 移位(<<,>>) > 关系(<,>,==,!=) > 位运算(&,^,|) > 逻辑(&&,||) > 赋值(=)。因此+的优先级最高。

第2题★☆☆☆☆
表达式a + b * c在C++中按以下哪种方式计算?

A.(a + b) * cB.a + (b * c)C.(a + b * c)D. 由编译器随机决定

答案:B
解析*(乘法)的优先级高于+(加法),因此先计算b * c,再与a相加。

第3题★★☆☆☆
表达式x = y = 5在C++中,赋值运算符=的结合性为( ),因此运算顺序为( )。

A. 左结合,(x = y) = 5B. 右结合,x = (y = 5)
C. 左结合,x = (y = 5)D. 右结合,(x = y) = 5

答案:B
解析:赋值运算符是右结合的,因此x = y = 5被解析为x = (y = 5)。先将5赋给y,再将y的值赋给x。

第4题★★☆☆☆
表达式a << b + c中,<<(左移)和+(加法)的优先级关系是( )。

A.<<优先级高于+B.+优先级高于<<
C. 二者优先级相同,从左到右计算 D. 二者优先级相同,从右到左计算

答案:B
解析+(加法)的优先级高于<<(左移),因此a << b + c被解析为a << (b + c)注意:若想表达(a << b) + c,必须加括号。


⚡ 第二梯队:混合表达式求值(第5-8题)

目标:掌握算术运算、关系运算、逻辑运算、位运算混合时的优先级顺序。

第5题★★☆☆☆
若有定义int a = 2, b = 3, c = 4;,则表达式a + b * c % 3的值为( )。

A. 2 B. 3 C. 4 D. 5

答案:C
解析*%优先级相同,高于+,且从左到右结合。
计算顺序:b * c % 3 = 3 * 4 % 3 = 12 % 3 = 0a + 0 = 2 + 0 = 2
注意%*/优先级相同,均为左结合。

第6题★★★☆☆
若有定义int a = 5, b = 3, c = 4;,则表达式a & b || c ^ b && a | c的值为( )(提示:&先于^先于|,位运算先于逻辑运算)。

A. true B. false C. 1 D. 0

答案:B
解析:按优先级逐步展开:

  1. 位运算(&^|)优先于逻辑运算(&&||)。

  2. a & b = 5 & 3 = 1

  3. a | c = 5 | 4 = 5

  4. c ^ b = 4 ^ 3 = 7

  5. 原式 =1 || 7 && 5

  6. &&优先级高于||7 && 5→ 非零即真,结果为true(1),但这里逻辑运算返回的是bool值,7 && 5值为true(在C++中输出为1)。

  7. 最终:1 || truetrue || truetrue(输出1,但选项是bool类型的话选 true)。

  8. 若选项为 bool 类型,选 A(true);若选项为整型,输出为 1。但看选项中有A. true,因此选 A。

注意:此题在C++中a & b结果为整数17 && 5结果为布尔值true(在表达式中参与运算时,true被提升为1false0),因此1 || 1true。答案为 true。

第7题★★★☆☆
若有定义int a = 7; float x = 2.5, y = 4.7;,则表达式x + a % 3 * (int)(x + y) % 2的值为( )。

A. 0.000000 B. 2.750000 C. 2.500000 D. 3.500000

答案:D
解析

  1. 先算(int)(x + y) = (int)(2.5 + 4.7) = (int)7.2 = 7

  2. 原式变为:x + a % 3 * 7 % 2

  3. a % 3 = 7 % 3 = 1

  4. 1 * 7 % 2 = 7 % 2 = 1*%同级,从左到右)

  5. x + 1 = 2.5 + 1.0 = 3.5(float + int → float)

第8题★★★☆☆
表达式1 & 1 || 0 && 0 | 1的值为( )。

A. 0 B. 1 C. true D. false

答案:C(或B,取决于选项类型)
解析

  1. 先算位运算&|1 & 1 = 10 | 1 = 1

  2. 原式变为:1 || 0 && 1

  3. &&优先级高于||0 && 1 = 0

  4. 1 || 0 = true(C++中输出为1)

  5. 因此选项 C(true)正确,输出为1。


🧠 第三梯队:阅读程序题(第9-11题)

目标:分析含有复合表达式的程序,判断输出或逻辑错误。

第9题★★★☆☆
阅读以下程序,若输入3 4,则输出为( )。

cpp

int main() { unsigned short x, y; cin >> x >> y; unsigned short z = x | y << 1; cout << z << endl; return 0; }

提示<<的优先级高于|
A. 7 B. 8 C. 11 D. 无法确定

答案:C
解析

  1. 输入x=3, y=4

  2. y << 1 = 4 << 1 = 8

  3. x | 8 = 3 | 8 = 11(二进制0011 | 1000 = 1011)。

  4. 输出11

第10题★★★★☆
阅读以下程序,若输入x = 2, y = 3,则程序输出为( )。

cpp

int main() { int x, y; cin >> x >> y; x = (x | x << 2) & 0x33; y = (y | y << 2) & 0x33; unsigned short z = x | y << 1; cout << z << endl; return 0; }

A. 7 B. 11 C. 14 D. 15

答案:C
解析

  1. 输入x=2, y=3

  2. x << 2 = 2 << 2 = 8x | 8 = 2 | 8 = 1010 & 0x33 = 10 & 51 = 2(二进制00001010 & 00110011 = 00000010)。因此x=2

  3. y << 2 = 3 << 2 = 12y | 12 = 3 | 12 = 1515 & 0x33 = 15 & 51 = 3(二进制00001111 & 00110011 = 00000011)。因此y=3

  4. y << 1 = 3 << 1 = 6

  5. z = x | 6 = 2 | 6 = 6(二进制0010 | 0110 = 0110)。

  6. 输出6。但选项中没有6,可能是题目选项有误,或计算过程需重新审视。

重算x = (x | x << 2) & 0x33x=2

  • 2 << 2 = 82 | 8 = 10(二进制1010),10 & 0x330x33=51=0011001110=00001010)→00001010 & 00110011 = 00000010 = 2。OK。
    y=3

  • 3 << 2 = 123 | 12 = 151111),15 & 0x3300110011)→00001111 & 00110011 = 00000011 = 3。OK。
    z = x | y << 1 = 2 | (3 << 1) = 2 | 6 = 6

输出为6,选项中没有,建议将题目选项改为包含6。

第11题★★★★☆
阅读以下程序,判断它的功能是( )。

cpp

int f(int x) { int cnt = 0; while (x) { x &= x - 1; cnt++; } return cnt; }

A. 统计x的二进制中0的个数 B. 统计x的二进制中1的个数
C. 判断x是否为2的幂 D. 计算x的绝对值

答案:B
解析

  • x &= x - 1的作用是:将 x 的二进制表示中最右侧的1变为0。例如:x = 12(1100)x-1=11(1011)1100 & 1011 = 1000(8),消去了一个1。

  • 每次循环消去一个1,cnt记录消去的次数,即二进制中1的个数。

  • 注意&=的优先级:x &= x - 1等价于x = x & (x - 1),因为&的优先级低于-(减法高于位运算),所以x - 1先算。


🔥 第四梯队:完善程序与综合应用(第12-14题)

目标:补全涉及运算符优先级判断的程序代码。

第12题★★★☆☆
下面的程序实现判断一个数是否为2的幂。请补全空缺处。

cpp

bool isPowerOfTwo(int x) { return (x > 0) && (x & (x - 1)) == ①; }

①处应填:
A.trueB.falseC.0D.1

答案:C
解析

  • 判断一个数是否为2的幂的方法是:(x & (x - 1)) == 0。例如x=4(100)x-1=3(011)100 & 011 = 0,为2的幂。

  • 注意:==的优先级高于&,所以(x & (x - 1)) == 0中的括号是必需的。

  • 如果写成x & (x - 1) == 0,会被解析为x & ((x - 1) == 0),逻辑错误。

易错点==的优先级高于&,因此必须加括号。

第13题★★★★☆
阅读以下程序,其输出结果为( )。

cpp

int main() { bool a = true, b = false, c = true; bool res = a && b || !c && a; cout << res << endl; return 0; }

A. 0 B. 1 C. true D. false

答案:D(false)
解析

  1. 优先级顺序:!>&&>||

  2. !c = false

  3. !c && a = false && true = false

  4. a && b = true && false = false

  5. false || false = false

  6. 输出0(C++中bool输出为0/1),若选项有false,选D。

第14题★★★★★
[CSP-J 2022] 逻辑表达式题源阅读:
表达式(0|1&0|1|1|(1|1))&(0&1&(1|0)|0|1|0)&0的值为( )。

A. 0 B. 1 C. 无法确定 D. 编译错误

答案:A
解析

  1. 按优先级逐步计算:&先于|( )优先。

  2. 第一段(0|1&0|1|1|(1|1))

    • 1|1 = 1(括号内)

    • 1&0 = 0

    • 原式变为0|0|1|1|1 = 1

  3. 第二段(0&1&(1|0)|0|1|0)

    • 1|0 = 1

    • 0&1&1 = 0

    • 0 | 0 | 1 | 0 = 1

  4. 原式 =(1) & (1) & 0 = 0

  5. 输出0。注意:&先于|,但整个表达式末尾&0,任何数&0都等于0。


📊 题型分布速查表

题号难度题型答案核心考点
1★☆☆☆☆优先级排序D+>&>==>&&
2★☆☆☆☆表达式求值B*高于+
3★★☆☆☆结合性判断B赋值运算符右结合
4★★☆☆☆优先级判断B+高于<<
5★★☆☆☆混合求值C%*/同级左结合
6★★★☆☆混合求值A&先于^先于|,位运算先于逻辑运算
7★★★☆☆混合求值D%*同级,+最后
8★★★☆☆混合求值B/C&&高于||,位运算先于逻辑
9★★★☆☆阅读程序C<<高于|
10★★★★☆阅读程序6(需调整选项)位运算混合应用
11★★★★☆阅读程序B&=-的优先级
12★★★☆☆完善程序C==高于&,需加括号
13★★★★☆程序阅读D/false!>&&>||
14★★★★★综合应用A逻辑表达式优先级与短路求值

📝 补充说明

  1. 第6题truefalse在C++中属于bool类型,输出时为10。若选项既有整数又有bool,需根据题目语境判断。

  2. 第10题:计算结果为6,但选项中没有,建议教师调整选项(如增加6)或更换数据。

  3. 第11题x &= x - 1是统计二进制中1的个数的经典写法,务必掌握。

  4. 第14题:此题来源于CSP-J 2022真题,体现了位运算与逻辑运算的混合考察,难度较高。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询