2015-11-18 3 views
-3

Я написал функцию печати следующим образом.Мой код, кажется, выполнен в неправильном порядке

#define NDEBUG 
void print(vector<int> &vec) 
{ 
#ifdef NDEBUG 
    std::cout << "vector size: " << vec.size() << std::endl; 
#endif 
    if (!vec.empty()) 
    { 
     auto temp = vec.back(); 
     vec.pop_back(); 
     print(vec); 
     std::cout << temp<<std::endl; 

    } 
} 

печатает:

vector sise:6 
vector sise:5 
vector sise:4 
vector sise:3 
vector sise:2 
vector sise:1 
vector sise:0 
1 
2 
3 
4 
5 
6 

, но я ожидаю, что это будет что-то вроде:

vector sise:6 
6 
vector sise:5 
5 
vector sise:4 
4 
vector sise:3 
3 
vector sise:2 
2 
vector sise:1 
1 
vector sise:0 

Является ли из-за приоритета потоков? если это так, как я могу контролировать правильный порядок выполнения в качестве моего кода?

+3

Вы говорите о теме, но вы код показать ничего не связанные с резьбой. Обновите свой вопрос с помощью sscce. – Hiura

+1

'sise'? действительно? :) –

+0

Ваш результат не соответствует вашему коду. «Сисек», как упоминалось, и пространство после толстой кишки. –

ответ

3

Решение

следующие строки перевернутый:

print(vec); 
    std::cout << temp<<std::endl; 

Они должны быть:

std::cout << temp<<std::endl; 
    print(vec); 

Обоснование

Если вы посмотрите т код, когда входной вектор имеет размер 6, вы первый выход размер:

std::cout << "vector size: " << vec.size() << std::endl; 

Затем будет вызывать функцию рекурсивно:

print(vec); 

И только после этого рекурсивного вызова вернет вам печать 6-й пункт:

Затем вы возвращаетесь с вашей функции. Таким образом, ясно, что 6-й элемент будет напечатан последним. Те же рассуждения применимы к рекурсивным вызовам и объясняют ваш вывод.

+0

Если это рекурсивный вопрос, почему «cout» работает после вызова функции? –

+0

Потому что вы пишете 'cout' ** после того, как ** вызываете свою функцию рекурсивно. Я обновил свое обоснование. – fjardon

+0

спасибо. У меня есть еще один вопрос. то, что меня смутило, заключается в том, что, если i 'cout' перед вызовом функции, вывод будет логичным, но при инверсии он, кажется, выскочит на фронт вектора и распечатает 1 2 3 4 5 6. почему это происходит? аргумент функции является «вектором = {1,2,3,4,5,6}» –

3

Вы вызываете print рекурсивно перед выходом temp. Думайте об этом, как это (с меньшим, например):

print vec(2) 
    cout size: 2 
    print vec(1) 
    cout size: 1 
     print vec(0) 
     cout size: 0 
    cout 1 
cout 2 

Вы должны выводиться перед рекурсии:

std::cout << temp << std::endl; 
print(vec); 
Смежные вопросы