遇到一个考试题目:
设x=1,y=2,z=3,则表达式y+=z- -/++x的值是()
A. 3 B. 3.5 C. 4 D. 5
一开始毫无头绪,后来看到答案明白了.
首先应是这样的:y+=(z- -/++x)把y+=后面的看成一个整体
然后 再考虑 z- -/++x 就是(z- -)/(++x)
z- - 先返回z 然后做自减运算
++x 先做自增运算 然后返回x
即:
y+=(3/2)
此时,z=2 x=2
3/2 都为int类型 故结果为1
即y+=1
y=3
另外x的值为2,z的值也为2
C语言运行结果:
表达式的值为3(即y的值)
从翻译的MIPS汇编语言我们可以发现
y+=z- -/++x
mipsasm
main:
addiu $sp,$sp,-32
sw $fp,28($sp)
move $fp,$sp
li $2,1 # 0x1 赋值x=1
sw $2,8($fp)
li $2,2 # 0x2 赋值y=2
sw $2,12($fp)
li $2,3 # 0x3 赋值z=3
sw $2,16($fp)
lw $2,16($fp) #取z=3的值给$2 , z- - 第一步返回z值
nop
addiu $3,$2,-1 #z- - 第二步 自减
sw $3,16($fp)
lw $3,8($fp)
nop
addiu $3,$3,1 #x++运算 $3自增
sw $3,8($fp)
lw $3,8($fp)
nop
bne $3,$0,1f
div $0,$2,$3 #除法运算$3=$2/$3
break 7
1:
mfhi $2
mflo $3
lw $2,12($fp) #读取y值
nop
addu $2,$2,$3 #y+=$3 至此y+=z--/++x运算结束
sw $2,12($fp) #回写y值
move $2,$0
move $sp,$fp
lw $fp,28($sp)
addiu $sp,$sp,32
j $31
nop