首先这里是代码:
//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
有点奇怪。
知道为什么吗?谢谢!
答案 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
调用约定,所规定的只是参数推入的顺序。只要将它们从右向左推入堆栈,仍然可以以任何顺序对其进行求值;您需要查看从您自己的编译器生成的汇编代码,以便确定。