三目運算子和條件語句

2021-10-01 08:55:25 字數 1868 閱讀 1126

#跳轉指令

有符號

無符號

低版本優化

10!=5

?5:7

;變數 != a ? b : c 且 b < c

sub reg,a ;如果a為0 則這一步省略

neg reg ;對變數求補(二進位製取反+

1),正變負,負變正

sbb reg,reg ;當初始reg為非0則值為-

1,否則為0

and reg,c-b ;如果為真則 reg = b-c

add reg,c

;變數 >= a ? b : c 且 b < c

cmp reg, a

setl al ;小於則al為 1

dec reg ;判斷為真 reg =

0 ,否則reg =-1

and reg,c-b ;如果為真則 reg =

0 否則reg = b-c

add reg,c ;如果為真則為c 否則 reg = c + b - c = b

高版本優化
;條件傳送指令cmovxx

cmovx source, destination

其中 x 是乙個或者連個字母的**,表示將觸發傳送操作的條件。

條件取決於 eflags 暫存器的當前值

;變數 == a ? b : c 且 b > c

mov reg1, b

test reg, a ;判斷變數與a是否相等

mov reg, c

cmovz reg, reg1 ;條件滿足則傳送(賦值)一次 reg = b=reg1 否則 reg = c

;案例printf

("%d\n"

, edi ==0?

67:-88

);mov ecx,

67

test edi, edi ;這裡直接影響zf標誌位

mov eax,-88

cmovz eax, ecx ;若果相等 則eax =

67 否則為-

88push eax

push offset unk_4020f8

call printf

單分支結構
jxx  if_end:..

;中間為條件體

.;注意語句上面無跳轉

if_end

雙分支結構
;第一種  被優化成單分支結構 減少分支

jxx if_end:..

;中間為條件體

.;注意語句上面無跳轉

if_end

;案例if

(argc == nnumber)

else

return nnumber;

;編譯器最後優化成

if(argc == nnumber)

printf

("%d"

,nnumber /5)

;return nnumber;

定式

jxx else_begin:..

.if_end:

jmp else_end:

else_begin ;注意上方為向下跳轉至結尾..

.else_end:

條件語句和三目運算子的區別

剛入職那會,編寫 一直都是用 條件語句。後來都不用條件判斷了,而直接改用三目運算子了。三目運算子condition expr1 expr2 condition or conditions 計算結果為true或false的表示式。expr1,expr2值可以是任何型別的表示式。下面先看一段案例。第一種...

C 條件運算子(三目運算子)

在某些情況下,可以用條件運算子 來簡化if語句。是乙個三元運算子,其構成的表示式格式為 表示式1 表示式2 表示式3 條件運算子的執行流程示意圖如上圖所示,描述如下 1 計算表示式1的值 2 若表示式的值為真 或非0 則只計算表示式2,並將其結果作為整個表示式的值 反之,即表示式1的值為假 或為0 ...

C 條件運算子(三目運算子)

在某些情況下,可以用條件運算子 來簡化if語句。基本格式 是乙個三元運算子,其構成的表示式格式為 表示式1 表示式2 表示式3 執行流程 條件運算子的執行流程示意圖如上圖所示,描述如下 1 計算表示式1的值 2 若表示式的值為真 或非0 則只計算表示式2,並將其結果作為整個表示式的值 反之,即表示式...