2015-11-16 7 views
0

У меня есть этот код:Вызов функции вне функции

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 в выводе.

ответ

1

Вы сказали:

Если компилятор вычисляет значение возвращаемой строки во время компиляции

Это не является правильным. Компилятор может вычислять некоторые выражения во время компиляции, но не все выражения. В этом случае его можно вычислить только во время выполнения.

cout << "1"; 

выполняется при вызове f() для инициализации a с линией

std::string a = *f(); 

Это происходит во время выполнения. а не во время компиляции.

b инициализируется используя значение a с линией

std::string b = a.append("2"); 

Это также происходит во время выполнения, а не во время компиляции.

+0

Но я никогда не вызываю f() во время выполнения ... Как называется 'cout << 1' – Kam

+1

Конечно, вы:' std :: string a = * f(); '. –

+0

OK Я в замешательстве, да вызовы f(), но a.append («2») не делает, а b просто так – Kam

-1

Ваш пример кода печатает «1», когда глобальная переменная a инициализируется «5», а затем после того, как глобальная переменная b инициализируется «52», то есть, когда выполняется main(). Таким образом, полный выход «1», а затем «52».

Обратите внимание, что функция f() действительно вызывается, а не main(), а инициализатором для глобальной переменной a.

+0

Но это приводит к тому, что вызов функции происходит во время выполнения ... Не происходит ли инициализация во время компиляции и результаты, записанные в двоичном формате? Итак, как называется cout? – Kam

+0

Вы продолжаете предполагать, что во время компиляции происходит что-то особенное. Ничего. Все инициализации происходят в _runtime_. –

+0

Нет, выражение инициализатора для a не является выражением const; он содержит вызов функции (с побочным эффектом), поэтому не может быть определен во время компиляции. Поэтому инициализатор для * должен * быть определен во время выполнения. – MarkU