2016-02-28 76 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