意外的功能行为

时间:2019-01-28 19:29:03

标签: c scope printf

首先这里是代码:

//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有点奇怪。

知道为什么吗?谢谢!

1 个答案:

答案 0 :(得分:3)

C标准没有规定要评估函数参数的强制性命令。这完全取决于实施/ ABI。

如果您正在使用indexOf之类的可变函数来遍及x86-32,则几乎可以肯定使用的是调用约定var arr = ["hello", "have", "a", "good", "day", "stackoverflow"]; function checkString(wordArray, str) { return str.replace(/([A-Z])/g, ' $1') .split(" ") // split on spaces .map(s => s.toLowerCase()) .filter(s => s) .every(e => wordArray.includes(e)); } console.log("should return true -> " + checkString(arr, "HelloStackoverflow")); console.log("should return false -> " + checkString(arr, "itIsAwfullyColdDayToday"));,其中参数从右向左推。这意味着printf的呼叫站点附近的汇编代码很可能看起来像(伪汇编代码):

cdecl

但是,请注意,即使使用printf调用约定,所规定的只是参数推入的顺序。只要将它们从右向左推入堆栈,仍然可以以任何顺序对其进行求值;您需要查看从您自己的编译器生成的汇编代码,以便确定。