本练习共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 = 0,a + 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
解析:按优先级逐步展开:
位运算(
&、^、|)优先于逻辑运算(&&、||)。a & b = 5 & 3 = 1a | c = 5 | 4 = 5c ^ b = 4 ^ 3 = 7原式 =
1 || 7 && 5&&优先级高于||:7 && 5→ 非零即真,结果为true(1),但这里逻辑运算返回的是bool值,7 && 5值为true(在C++中输出为1)。最终:
1 || true→true || true→true(输出1,但选项是bool类型的话选 true)。若选项为 bool 类型,选 A(true);若选项为整型,输出为 1。但看选项中有
A. true,因此选 A。
注意:此题在C++中a & b结果为整数1,7 && 5结果为布尔值true(在表达式中参与运算时,true被提升为1,false为0),因此1 || 1为true。答案为 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
解析:
先算
(int)(x + y) = (int)(2.5 + 4.7) = (int)7.2 = 7原式变为:
x + a % 3 * 7 % 2a % 3 = 7 % 3 = 11 * 7 % 2 = 7 % 2 = 1(*和%同级,从左到右)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,0 | 1 = 1原式变为:
1 || 0 && 1&&优先级高于||:0 && 1 = 01 || 0 = true(C++中输出为1)因此选项 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
解析:
输入
x=3, y=4。y << 1 = 4 << 1 = 8。x | 8 = 3 | 8 = 11(二进制0011 | 1000 = 1011)。输出
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
解析:
输入
x=2, y=3。x << 2 = 2 << 2 = 8,x | 8 = 2 | 8 = 10,10 & 0x33 = 10 & 51 = 2(二进制00001010 & 00110011 = 00000010)。因此x=2。y << 2 = 3 << 2 = 12,y | 12 = 3 | 12 = 15,15 & 0x33 = 15 & 51 = 3(二进制00001111 & 00110011 = 00000011)。因此y=3。y << 1 = 3 << 1 = 6。z = x | 6 = 2 | 6 = 6(二进制0010 | 0110 = 0110)。输出
6。但选项中没有6,可能是题目选项有误,或计算过程需重新审视。
重算:x = (x | x << 2) & 0x33,x=2:
2 << 2 = 8,2 | 8 = 10(二进制1010),10 & 0x33(0x33=51=00110011,10=00001010)→00001010 & 00110011 = 00000010 = 2。OK。y=3:3 << 2 = 12,3 | 12 = 15(1111),15 & 0x33(00110011)→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)
解析:
优先级顺序:
!>&&>||。!c = false。!c && a = false && true = false。a && b = true && false = false。false || false = false。输出
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
解析:
按优先级逐步计算:
&先于|,( )优先。第一段
(0|1&0|1|1|(1|1)):1|1 = 1(括号内)1&0 = 0原式变为
0|0|1|1|1 = 1
第二段
(0&1&(1|0)|0|1|0):1|0 = 10&1&1 = 00 | 0 | 1 | 0 = 1
原式 =
(1) & (1) & 0 = 0输出
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 | 逻辑表达式优先级与短路求值 |
📝 补充说明
第6题:
true和false在C++中属于bool类型,输出时为1和0。若选项既有整数又有bool,需根据题目语境判断。第10题:计算结果为6,但选项中没有,建议教师调整选项(如增加
6)或更换数据。第11题:
x &= x - 1是统计二进制中1的个数的经典写法,务必掌握。第14题:此题来源于CSP-J 2022真题,体现了位运算与逻辑运算的混合考察,难度较高。