[英]unexpected function behaviour
首先,這里是代碼:
//functions
char dernier(char* s){
return s[strlen(s)-1];
}
char* debut(char* s){
s[strlen(s)-1] = '\0';
return s;
}
//problematic bit :
printf("%s %s %c", debut(s), s, dernier(s)); //s = "test"
我期望輸出為tes tes s
但是我得到的是tes tes t
,我覺得很奇怪。
知道為什么嗎? 謝謝!
C標准沒有強制要求對函數的參數進行評估的順序。 這完全取決於實施/ ABI。
如果您在使用諸如printf
類的可變函數的無處不在的x86-32上,則幾乎可以肯定使用了調用約定cdecl
,其中參數從右向左推。 這意味着在printf
的調用站點附近的匯編代碼很可能看起來像(偽匯編代碼):
push @s
call _dernier
push <ret val from _dernier>
push @s
push @s
call _debut
push <ret val from _debut>
push @format_string
call _printf
但是請注意,即使使用cdecl
調用約定,所規定的僅是推入參數的順序。 只要將它們從右向左推入堆棧,仍然可以以任何順序對其進行求值; 您需要查看從您自己的編譯器生成的匯編代碼,以便確定。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.