我有这段代码:
std::string* f()
{
cout << "1";
return new string("5");
}
std::string a = *f();
std::string b = a.append("2");
int main()
{
cout << b;
return 0;
}
此代码运行并返回152
怎么可能?如果编译器在编译时计算其返回字符串的值,那么在运行代码时我怎么看1
?如果这是在运行时完成的,那么我在运行时从不调用f(),所以我不应该在输出中看到1
。
答案 0 :(得分:1)
你说:
如果编译器在编译时计算其返回字符串的值
这是不正确的。编译器可以在编译时计算一些表达式,但不能计算所有表达式。在这种情况下,它只能在运行时计算。
cout << "1";
当您致电f()
以使用行初始化a
时,会执行
std::string a = *f();
这在运行时发生。不是在编译时。
使用b
的值初始化 a
std::string b = a.append("2");
这也发生在运行时,而不是在编译时。
答案 1 :(得分:-1)
您的示例代码打印&#34; 1&#34;当全局变量a用&#34; 5&#34;初始化,然后用&#34; 52&#34;初始化全局变量b后,即main()运行时。所以完整的输出是&#34; 1&#34;然后是&#34; 52&#34;。
请注意,函数f()确实被调用,而不是来自main(),而是来自全局变量a的初始化器。