跳转至

带短路规则的运算器

背景故事

自动化工厂要解释带条件判断的控制表达式。未被条件选中的计算不应让整条控制指令失败,因此运算器必须准确处理短路规则。

形式化问题描述

计算一行语法合法的表达式。字面量是 \(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 秒。

测量环境与方法 · 测量记录 · 题解