【问题标题】:Why is my function getting variables value on wrong order? [duplicate]为什么我的函数以错误的顺序获取变量值? [复制]
【发布时间】:2020-10-12 00:35:49
【问题描述】:

我是编程新手。这是我的代码的一部分:

double logic(double a,double b)

{
    (Code Here...)
}
double inputDouble(double x)

{
    std::cout << "Please, input a floating number: ";
    std::cin >> x;
    std::cout << std::endl;
    return x;
}
int main()

{
    double a,b;
    std::cout << logic(inputDouble(a),inputDouble(b));
    return 0;
}

我注意到编译器的问题,我检查了调试窗口,我遇到的问题是,当我通过 'inputDouble' 函数在 'a' 上插入一个值时,它会转到 ' b',反之亦然。所以在程序结束时,我在“逻辑”函数中得到的是:double a=b(From main()),double b=a(From main())。我希望并感谢能够向我解释我做错了什么的人,因此变量被分配到了错误的位置。如果这篇文章有任何语法错误,我也深表歉意,因为英语不是我的第一语言。

【问题讨论】:

  • C++ 不保证计算参数的顺序。因此,当您编写调用 logic(inputDouble(a), inputDouble(b), inputSignal()) 时,不能保证它会首先计算出 inputDouble(a),然后是 inputDouble(b),然后是 inputSignal() 第三个。如果您想强制执行该命令,请在main 中执行这些调用,将结果保存到变量中,然后调用logic(a, b, signal) 或其他方法。
  • 另一个观察结果是inputDouble 实际上并没有使用它的参数,它只是将它用作存储double 的一种方式。你可以把它写成double inputDouble(),然后有一个函数局部变量x,就像main中的ab一样。 (如果您认为 inputDouble 的效果是将来自 cin 的输入保存到参数 x 中,那不是正在发生的事情——查看按值传递和按引用传递。)
  • @Nathan Pierson 谢谢你的回答。这当然有助于理解问题以及如何解决它,但是,我在这里遇到的问题是,当我尝试将值 a 和 b 从一个函数传递给另一个函数时,它会颠倒它们的顺序......不是我能做些什么来解决它?如果没有他们,那就太难过了:(
  • @StephenNewell 谢谢你的回答。抱歉,我是一名新程序员,您的链接似乎包含一些高级内容和概念,因此我无法理解。
  • @NathanPierson,哇,它真的有效:O 谢谢你帮助我,这似乎是我的一个逻辑错误。非常感谢

标签: c++


【解决方案1】:

表达式:

logic(inputDouble(a),inputDouble(b))

保证这些对inputDouble() 的调用的顺序,只是它们在调用logic() 之前都是完整的。所以它可以先调用a,也可以先调用b(a)

保证订单,您可以使用类似:

double inputDouble() { // slight change, see below.
    double x;
    std::cout << "Please, input a floating number: ";
    std::cin >> x;
    std::cout << std::endl;
    return x;
}

int main() {
    double a = inputDouble(); // guarantee get 'a' first.
    double b = inputDouble();
    std::cout << logic(a, b);
    return 0;
}

你也可以使用:

    double a = inputDouble();             // guarantee get 'a' first.
    std::cout << logic(a, inputDouble());

但我更喜欢第一个以保持一致性。


您会注意到 inputDouble() 函数也发生了细微的变化以删除参数,将未初始化的值传递给函数,然后覆盖并返回它没有任何用处。

相反,我只是使用了一个局部变量来接收值并返回它。

一个更健壮的程序还可以确保用户输入是有效的,但可以留给不同的问题,因为它几乎肯定已经存在于这个网站上。


(a) 对于我们当中的语言律师,这在C++20 [expr.call] /8(我的重点)中有介绍:

参数的初始化,包括每个相关的值计算和副作用,相对于任何其他参数的顺序是不确定的。 [注意:所有副作用在输入函数之前对参数评估进行排序]。

【讨论】:

  • 实际上我什至没有意识到 C++ 会让您将未初始化的变量按值传递给函数。尽管我认为编译时检查是停止问题,并且永远不会执行运行时检查,因为它从未读取过?在任何情况下都令人惊讶的行为。
  • @Nathan:是否读取它对编译器来说不是问题。 C++ 将假设开发人员遵守规则,这允许它对性能做出某些假设。
  • 谢谢,这就是我的问题的解决方案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多