1. 程式人生 > >y+=z--/++x 的討論

y+=z--/++x 的討論

遇到一個考試題目:
設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