下列 C++ 表达式与 2 * - 2 % 3 的值相同的是( )。
这题考的是运算符优先级陷阱。C++里一元负号优先级高于乘除取模,而乘除取模同级且左结合。所以2 * -2 % 3 先算 -2 再算 2 * (-2) = -4,最后 -4 % 3 = -1。关键要记住:负号只作用于紧邻的数,不是对整个式子取反。
GESP 一级第二模块"表达式与运算符"第 3 点"运算符优先级与结合性"。命题人专门放这道题,就是要卡住 90% 考生对一元负号优先级和乘除取模左结合的模糊认知。
看到题先想运算符优先级表:一元负号(-)优先级最高,乘除取模(*、/、%)同级且左结合。所以 2 * - 2 % 3 等价于 ((2 * -2) % 3)。
-2(一元负号直接作用于 2)2 * -2 = -4(乘号左结合)-4 % 3 = -1(C++ 取模保留被除数符号)最终值 = -1。
错误在于把 -2 % 3 当成 -(2 % 3),实际 -2 % 3 = -2,然后 2 * (-2) = -4。
括号强制先算 2 % 3 = 2,再算 -2,最后 2 * (-2) = -4。
一元负号优先级最高,先算 -2,然后 % 和 * 左结合:2 % -2 = 0,0 * 3 = 0。
a % b 的符号跟随 a,所以 -4 % 3 = -1,不是 1。如果把原题改成 2 * -3 % 4,答案仍是 A;若把 % 换成 / 则 D 会突然变 -1(因为整数除法截断);若把一元负号改成括号 2 * -(2 % 3),正确选项就变成 B。这类变式都能精准考察优先级与结合性的理解深度。