带短路规则的运算器¶
背景故事¶
自动化工厂要解释带条件判断的控制表达式。未被条件选中的计算不应让整条控制指令失败,因此运算器必须准确处理短路规则。
形式化问题描述¶
计算一行语法合法的表达式。字面量是 \(0\) 到 \(10^9\) 的十进制非负整数;允许前导零,仍按十进制解释。空格和制表符可出现在记号之间。括号改变结合顺序。没有自增、自减运算符。下表按优先级从高到低排列;同一行优先级相同。
| 运算符 | 作用 | 结合方向 |
|---|---|---|
一元 + - ! ~ |
正号、负号、逻辑非、逐位非 | 右结合 |
* / % |
乘、除、余数 | 左结合 |
二元 + - |
加、减 | 左结合 |
<< >> |
左移、右移 | 左结合 |
< > <= >= |
有符号大小比较 | 左结合 |
== != |
相等、不等 | 左结合 |
& |
逐位与 | 左结合 |
^ |
逐位异或 | 左结合 |
\| |
逐位或 | 左结合 |
&& |
逻辑与 | 左结合 |
\|\| |
逻辑或 | 左结合 |
? : |
条件选择 | 左结合 |
具体规则如下。
- 所有值为 32 位补码有符号整数。加、减、乘、取负和左移保留结果的低 32 位。逐位运算使用这 32 位。
- 除法向零取整,余数满足 \(a=(a/b)b+a\%b\) .特例:最小整数除以 \(-1\) 仍得到最小整数,对 \(-1\) 取余得到 \(0\) .
- 移位次数为右操作数的低 5 位,即 \(0\) 到 \(31\) ;右移使用符号位补齐。
- 零为假,其余为真;比较和逻辑运算返回 \(0\) 或 \(1\) .
a&&b在a为假时不计算b;a||b在a为真时不计算b.a?b:c仅计算选中的分支。- 条件式的中间分支是完整表达式;最后分支不包含未加括号的条件运算。精确语法为
Conditional := LogicalOr ('?' Expression ':' LogicalOr)*.因此1?0:1?2:3等于(1?0:1)?2:3,值为 \(3\) . - 只有实际需要计算的除法或取余遇到零除数时,整个表达式才报错,输出
Segmentfault.条件本身出错也会传播。除此之外没有运行时错误。
输入格式¶
输入一行表达式,行尾换行符不属于表达式。
输出格式¶
输出一行:有符号十进制结果,或 Segmentfault .
样例 1¶
输入¶
1?0:1?2:3
输出¶
3
样例 2¶
输入¶
0 && (1 / 0)
输出¶
0
样例 3¶
输入¶
(1/0) || 1
输出¶
Segmentfault
样例 4¶
输入¶
15 << 33
输出¶
30
样例 5¶
输入¶
(1 << 31) / -1
输出¶
-2147483648
样例说明¶
样例依次展示条件式左结合、忽略未使用分支的错误、条件自身错误、移位次数取低 5 位,以及最小整数除以 −1 的环绕。
逻辑与的左值为零时,右侧除零不会成为整个表达式的错误。
数据范围与分组¶
表达式长度 \(1\le n\le200000\) ,包含空白字符。字面量不超过 \(10^9\) .保证符合上述语法。
规格由 Codex(GPT-6)重新设计:补充长度、整数环绕与错误规则,明确条件运算左结合。
| 分值 | 额外限制 |
|---|---|
| 20% | \(n\le60\) |
| 30% | \(n\le5000\) |
| 50% | 无额外限制 |
资源限制¶
时间 0.5 秒;内存 128 MiB。
时限取标准程序正式数据五次运行的最慢中位数的 2 倍,向上取整到 0.5 秒。