from stdint import * import w32.win32console import t, c from t import CInt, CExport import stdio import stdlib import string import testcheck # 副作用函数:将 buf[0] 置为 1,返回 True def bump_true(buf: bytes) -> bool: buf[0] = 1 return True # 副作用函数:将 buf[0] 置为 1,返回 False def bump_false(buf: bytes) -> bool: buf[0] = 1 return False def main() -> CInt | CExport: w32.win32console.SetConsoleCP(65001) w32.win32console.SetConsoleOutputCP(65001) testcheck.begin("if 短路机制测试") buf: bytes = stdlib.malloc(1) # === Test 1: False and bump_true() - bump 不应被调用 === testcheck.section("Test 1: False and bump_true()") buf[0] = 0 r1: bool = False and bump_true(buf) testcheck.check(buf[0] == 0, "and short-circuit OK (bump not called)", "and short-circuit FAILED (bump called)") # === Test 2: True or bump_true() - bump 不应被调用 === testcheck.section("Test 2: True or bump_true()") buf[0] = 0 r2: bool = True or bump_true(buf) testcheck.check(buf[0] == 0, "or short-circuit OK (bump not called)", "or short-circuit FAILED (bump called)") # === Test 3: True and bump_true() - bump 应被调用 === testcheck.section("Test 3: True and bump_true()") buf[0] = 0 r3: bool = True and bump_true(buf) testcheck.check(buf[0] == 1, "and eval OK (bump called)", "and eval FAILED (bump not called)") # === Test 4: False or bump_true() - bump 应被调用 === testcheck.section("Test 4: False or bump_true()") buf[0] = 0 r4: bool = False or bump_true(buf) testcheck.check(buf[0] == 1, "or eval OK (bump called)", "or eval FAILED (bump not called)") # === Test 5: if 语句中的短路 === testcheck.section("Test 5: if 语句中的短路") buf[0] = 0 if False and bump_true(buf): testcheck.check(False, "should not enter if", "if False and entered") testcheck.check(buf[0] == 0, "if and short-circuit OK", "if and short-circuit FAILED") buf[0] = 0 if True or bump_true(buf): testcheck.check(True, "if True or entered OK", "if True or not entered") else: testcheck.check(False, "should enter if", "if True or else") testcheck.check(buf[0] == 0, "if or short-circuit OK", "if or short-circuit FAILED") # === Test 6: 嵌套短路 === testcheck.section("Test 6: 嵌套短路") buf[0] = 0 r6: bool = False and (True or bump_true(buf)) testcheck.check(buf[0] == 0, "nested and short-circuit OK", "nested and short-circuit FAILED") buf[0] = 0 r7: bool = True or (False and bump_true(buf)) testcheck.check(buf[0] == 0, "nested or short-circuit OK", "nested or short-circuit FAILED") # === Test 7: not 与短路 === testcheck.section("Test 7: not 与短路") buf[0] = 0 r8: bool = not False and bump_true(buf) testcheck.check(buf[0] == 1, "not and eval OK (bump called)", "not and eval FAILED (bump not called)") buf[0] = 0 r9: bool = not True or bump_true(buf) testcheck.check(buf[0] == 1, "not or eval OK (bump called)", "not or eval FAILED (bump not called)") # === Test 8: and 链中第一个为 False,后续不评估 === testcheck.section("Test 8: and 链短路") buf[0] = 0 r10: bool = False and bump_true(buf) and bump_true(buf) testcheck.check(buf[0] == 0, "and chain short-circuit OK", "and chain short-circuit FAILED") # === Test 9: or 链中第一个为 True,后续不评估 === testcheck.section("Test 9: or 链短路") buf[0] = 0 r11: bool = True or bump_true(buf) or bump_true(buf) testcheck.check(buf[0] == 0, "or chain short-circuit OK", "or chain short-circuit FAILED") # === Test 10: and 返回值正确性 === testcheck.section("Test 10: and 返回值正确性") buf[0] = 0 r12: bool = True and bump_true(buf) testcheck.check(r12, "and return True OK", "and return True FAILED") buf[0] = 0 r13: bool = True and bump_false(buf) testcheck.check(not r13, "and return False OK", "and return False FAILED") # === Test 11: or 返回值正确性 === testcheck.section("Test 11: or 返回值正确性") buf[0] = 0 r14: bool = False or bump_true(buf) testcheck.check(r14, "or return True OK", "or return True FAILED") buf[0] = 0 r15: bool = False or bump_false(buf) testcheck.check(not r15, "or return False OK", "or return False FAILED") stdlib.free(buf) return testcheck.end()