簡體   English   中英

意外的功能行為

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM