112 lines
3.1 KiB
Python
112 lines
3.1 KiB
Python
import stdio
|
||
import t, c
|
||
|
||
|
||
# ============================================================
|
||
# 简单指针 + 逻辑测试
|
||
# ============================================================
|
||
|
||
def ptr_test() -> int:
|
||
# 逻辑测试:if 语句
|
||
x: int = 10
|
||
if x:
|
||
stdio.printf("if: x is truthy\n")
|
||
|
||
if 1 == 1:
|
||
stdio.printf("if: 1==1 is truthy\n")
|
||
|
||
# While 循环 + 累加
|
||
i: int = 0
|
||
total: int = 0
|
||
while i < 5:
|
||
total = total + i
|
||
i = i + 1
|
||
stdio.printf("while: total=%d i=%d\n", total, i)
|
||
|
||
# For 循环
|
||
for j in range(5):
|
||
stdio.printf("for: j=%d\n", j)
|
||
|
||
# Break 测试
|
||
for k in range(10):
|
||
if k == 3:
|
||
break
|
||
stdio.printf("break: k=%d\n", k)
|
||
|
||
# Continue 测试
|
||
for m in range(5):
|
||
if m == 2:
|
||
continue
|
||
stdio.printf("continue: m=%d\n", m)
|
||
|
||
# 布尔运算 and(短路求值)
|
||
if x > 5 and x < 100:
|
||
stdio.printf("bool: x>5 and x<100 is true\n")
|
||
|
||
# 布尔运算 or(短路求值)
|
||
if x > 100 or x > 5:
|
||
stdio.printf("bool: x>100 or x>5 is true\n")
|
||
|
||
# ============================================================
|
||
# 指针 + c.Deref / c.DerefAs 测试
|
||
# ============================================================
|
||
|
||
# 字符串遍历: while c.Deref(p) != 0
|
||
s: str = "hello"
|
||
sp: str = s
|
||
slen: int = 0
|
||
while c.Deref(sp) != 0:
|
||
slen = slen + 1
|
||
sp = sp + 1
|
||
stdio.printf("ptr: len(hello)=%d\n", slen)
|
||
|
||
# c.DerefAs 写入字符(使用 c.Addr 获取栈变量地址,字符串字面量是只读的)
|
||
v: int = 65 # 'A'
|
||
px: str = c.Addr(v)
|
||
c.DerefAs(px, 88) # *px = 88
|
||
stdio.printf("ptr: after DerefAs v=%d\n", v)
|
||
|
||
# 遍历字符串并累加字符值
|
||
p2: str = "ABC"
|
||
total_ch: int = 0
|
||
while c.Deref(p2) != 0:
|
||
total_ch = total_ch + c.Deref(p2)
|
||
p2 = p2 + 1
|
||
stdio.printf("ptr: sum(A,B,C)=%d\n", total_ch)
|
||
|
||
# ============================================================
|
||
# c.Load 测试: *a = *b(加载源指针的值,存储到目标指针)
|
||
# ============================================================
|
||
|
||
# 基本复制: v2 = v1
|
||
v1: int = 42
|
||
v2: int = 0
|
||
c.Load(c.Addr(v2), c.Addr(v1))
|
||
stdio.printf("ptr: c.Load v2=%d (expected 42)\n", v2)
|
||
if v2 != 42:
|
||
stdio.printf("[FAIL] c.Load expected 42 got %d\n", v2)
|
||
return 1
|
||
|
||
# 覆盖已有值: v3 = v4
|
||
v3: int = 100
|
||
v4: int = 200
|
||
c.Load(c.Addr(v3), c.Addr(v4))
|
||
stdio.printf("ptr: c.Load overwrite v3=%d (expected 200)\n", v3)
|
||
if v3 != 200:
|
||
stdio.printf("[FAIL] c.Load overwrite expected 200 got %d\n", v3)
|
||
return 1
|
||
|
||
# 验证源不被修改: v5 保持原值
|
||
v5: int = 999
|
||
v6: int = 0
|
||
c.Load(c.Addr(v6), c.Addr(v5))
|
||
stdio.printf("ptr: c.Load src unchanged v5=%d v6=%d (expected 999, 999)\n", v5, v6)
|
||
if v5 != 999:
|
||
stdio.printf("[FAIL] c.Load src changed v5=%d\n", v5)
|
||
return 1
|
||
if v6 != 999:
|
||
stdio.printf("[FAIL] c.Load dst expected 999 got %d\n", v6)
|
||
return 1
|
||
|
||
return 0
|