2016-02-28 75 views
2

如果我輸入299,399,10,5的順序,計算機應該給我一個答案5.但它給了我-5。爲什麼不是5?這讓我感到困惑。幫幫我!!簡單的C++代碼給出錯誤的答案

#include "stdafx.h" 
#include <iostream> 

int add(int x, int y) 
{ 
    int a=x-y; 
    return a; 
} 

int x(int a) 
{ 
    std::cin >> a; 
    return a; 
} 

int y(int a) 
{ 
    std::cin >> a; 
    return a; 
} 

int main() 
{ 
    int a; 
    int b; 
    std::cin >> a; 
    std::cin >> b; 
    std::cout << add(x(a), y(b)); 
    return 0; 
} 

回答

6

編譯器可以按照自己喜歡的順序自由調用x(a)和y(b)。如果你這樣寫:

int c = x(a); 
int d = y(b); 
std::cout << add(c, d); 

它應該工作。

哦,請不要命名減法功能 '添加' ... :)

+0

是的,我假設編譯器像人一樣工作,它會在函數的參數列表中從左到右調用。 現在它恰恰相反! 是的,add()只應該添加! 非常感謝! – DianyiLiu

0

因爲x = 5和y = 10,所以5 - 10 = -5

+0

這並沒有真正回答這個問題。 – Zulan

-1

在你的第一個問題Y(a)函數執行並且比x(a)函數。由於C/C++是一個右側可執行函數。無論何時你在函數內提到函數 例如c =(X(a),Y(b)); 在本例中,先執行Y(a)函數,然後執行X(a)函數。你的程序是正確的,但需要清楚執行哪個函數。因此我已經更新了你的代碼,如下所示。

int add(int x, int y) 
{ 
    std::cout<<"Executing add function"; 
    std::cout<<"x="<<x<<" y="<<y; 
    int a=x-y; 
    return a; 
} 

int x(int a) 
{ 
    std::cout<<"Executing X function"; 
    std::cin >> a; 
    std::cout <<"X will return "<<a; 
    return a; 
} 


int y(int a) 
{ 
    std::cout<<"Executing Y Function\n"; 
    std::cin >> a; 
    std::cout <<"y will return "<<a; 
    return a; 
} 

int main() 
{ 
    int a; 
    int b; 
    std::cin >> a; 
    std::cin >> b; 
    std::cout << add(x(a), y(b)); 
    return 0; 
} 

現在你可以很容易地找出哪個函數正在執行,並可以相應地提供輸入。

+0

非常感謝! 我假設編譯器會在函數的參數列表中從左到右執行。 現在我知道它恰恰相反! – DianyiLiu

+0

注意:這個答案是錯誤的。這是隨機的順序。 –

+0

你是說順序依賴於編譯器的類型? 我做了幾個測試,每次我的編譯器從右到左在函數的參數列表中調用。 – DianyiLiu

1

在聲明

std::cout << add(x(a), y(b)); 

其中x(a)y(b)調用的順序是由C++標準指定。這意味着x()可能在y()之前被調用,或者它可能不會。

你假設x()被稱爲第一個。如果首先調用y(),您將看到您看到的結果。編譯器無論哪種方式都是正確的(在本例中,這基本上就是標準中「未指定」的含義)。

如果這些事情的順序很重要,您需要通過確保正確的順序來強制解決問題。例如;

a = x(a); 
b = y(b); 
std::cout << add(a,b); 

還有一些關切x()y()不使用從主叫方傳遞的值。除非它們是函數所需的其他東西的佔位符,否則調用者不應該通過它們。

並且有一個名爲add()的函數可以進行減法....用肥皂清洗你的嘴。

+0

謝謝! 我假設x()首先被調用。因爲我認爲編譯器會在函數的參數列表中從左到右執行。 我做了一個測試,它恰恰相反。編譯器從右向左執行!!! 是的,add()應該添加... – DianyiLiu

+0

它與編譯器「恰好相反」。不要編寫依賴於此的代碼。實際的順序是實現定義的,這意味着不同的實現可以選擇不同的順序。和其他編譯器一樣。 – Peter

+0

感謝您的諮詢! 「執行定義」,第一次聽到這個。但是現在我知道我必須告訴編譯器調用函數的確切順序。好!! – DianyiLiu