2013-11-21 83 views
1

在這裏,我寫了一個簡單隊列類模板:C++:STD的順序::法院

#include "stdafx.h" 
#include "iostream" 
#include "conio.h" 

template <class T> class Queue { 
private: 
    struct Node { 
     T value; 
     Node *next; 
    }; 
    Node *first, *last; 
public: 

    Queue() { //Initialization 
     first = 0; 
     last = 0; 
    }; 

    void push(T value) { //Put new value into Queue 
     Node *p = new Node; 
     p->value = value; 

     if (!first) //If Queue is not empty 
      first = p; 
     else 
      last->next = p; 

     last = p; //Put the value to the last of the Queue 
    }; 

    T get() { //Get the first value of the Queue 
     return (first) ? first->value : NULL; 
    }; 

    T pop() { //Take the first value out of Queue 
     T result = first->value; 
     Node *temp = first; 
     first = first->next; 
     delete temp; 
     return result; 
    }; 
}; 

int _tmain(int argc, _TCHAR* argv[]) 
{ 
    Queue<int> bag; 
    bag.push(1); //Bag has value 1 
    bag.push(2); //Bag has values: 1, 2 

    std::cout << bag.get() << '\n' << bag.pop() << '\n' << bag.pop(); 
    _getch(); 
    return 0; 
} 

有一個問題 - 輸出爲:

0 
2 
1 

/* 
Correct output should be: 
1 
1 
2 
*/ 

當調試的std::cout行,我發現程序調用bag.pop()在最右邊的第一個,然後bag.pop(),最後bag.get()。 這是正確的順序嗎?

+5

的順序是不確定的,如果你需要一個特定的順序您的cout語句分成三段。 'std :: cout << bag.get()<<'\ n'; std :: cout << bag.pop()<<'\ n'; std :: cout << bag.pop();' – john

+0

如果你搜索了,你會發現一些答案:[cout <<打印函數的調用順序?](http://stackoverflow.com/questions/2129230/ cout-order-of-call-to-functions-it-prints/2129242#2129242)&[使用std :: cout評估參數的順序](http://stackoverflow.com/questions/7718508/order-of-評估的參數使用stdcout) – crashmstr

+1

如果模板類型'T'不是一個指針?那麼你不能在'get'函數中返回'NULL'(除非'T'是一個可以從整數'0'隱式創建的類型)。 –

回答

4
T get() { //Get the first value of the Queue 
    return (!first) ? first->value : NULL; 
}; 

這倒退了。丟掉!。你是在說:「如果first非空,(即如果first空),使用它。

也就是說,一個參數評測給函數的順序是不確定的(編譯器可以計算。按任意順序感覺,只要他們都做本身的功能開始之前)也就是說get()pop()pop()可以以任何順序被稱爲參數來調用它們單獨的語句:

int a = bag.get(); 
int b = bag.pop(); 
int c = bag.pop(); 
std::cout << a << b << c; 
+0

謝謝。我修復了這個錯誤,但程序拋出了異常,因爲在程序調用另外兩個'bag.pop()'後,first-> value沒有任何值返回。 –

0
T get() { //Get the first value of the Queue 
    return (!first) ? first->value : NULL; 
}; 

如果first有效,則返回NULL。這被解釋爲零。你應該顛倒你的邏輯。

+0

謝謝。我修正了這個問題。 –

0

是的,在計算參數的函數時沒有指定。通過這個簡單的測試,你會得到那是什麼意思。

#include <iostream> 
int b(void) {std::cout<<3<<std::endl; return 3;} 
int c(void) {std::cout<<4<<std::endl; return 4;} 
int main(int argc, char *argv[]) 
{ 
    int d = b() + c(); 
    std::cout<<d<<std::endl; 
    return 0; 
} 

所以你會得到3 4 5或4 3 5