正如在另一个答案中已经说过的那样,maxx
函数const char *
作为参数获取,因此您比较指针,结果取决于编译器放置的顺序Hello
和World
数据部分。
那么为什么取消注释时顺序会改变string s = "Hello";
?因为您在这样做时引入了另一个const char *
值,并且编译器将为另一个使用相同的地址,因为这些 const char 不得更改,并且似乎从后到前评估参数。Hello
= "Hello"
Hello
maxx("Hello","World")
gcc
maxx("Hello", "World")
所以对于gcc
:
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
// string s = "Hello";
cout<<maxx("Hello","World")<<"\n";
return 0;
}
将导致:
.LC0:
.string "World"
.LC1:
.string "Hello"
.LC2:
.string "\n"
main:
push rbp
mov rbp, rsp
mov edi, 0
call std::ios_base::sync_with_stdio(bool)
mov esi, 0
mov edi, OFFSET FLAT:_ZSt3cin+16
call std::basic_ios<char, std::char_traits<char> >::tie(std::basic_ostream<char, std::char_traits<char> >*)
mov esi, OFFSET FLAT:.LC0
mov edi, OFFSET FLAT:.LC1
call char const* maxx<char const*>(char const*, char const*)
mov rsi, rax
mov edi, OFFSET FLAT:_ZSt4cout
call std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)
mov esi, OFFSET FLAT:.LC2
mov rdi, rax
call std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)
mov eax, 0
pop rbp
ret
如果您现在取消注释string s = "Hello";
,它将导致:
.LC0:
.string "Hello"
.LC1:
.string "World"
.LC2:
.string "\n"
main:
…
因为Hello
is 在这种情况下首先在string s = "Hello";
beforemaxx("Hello","World")
被评估,所以Hello
在这种情况下,第一个 const 字符串添加到数据部分 then World
。
如果您string s2 = "World";
在您之前添加一个,string s
那么订单将再次更改:
string s2 = "World";
string s = "Hello";
cout<<maxx("Hello","World")<<"\n";
.LC0:
.string "World"
.LC1:
.string "Hello"
.LC2:
.string "\n"
main:
…