c++ 为什么我的int函数会得到警告:控件是否到达非空函数的末尾?

wpx232ag  于 2023-06-25  发布在  其他
关注(0)|答案(3)|浏览(194)

我有一个函数Largest,它接受三个参数abc。该函数旨在返回三个输入中的最大值。然而,当我编译代码时,我遇到了一个错误,指出该函数可能不会返回值。我不确定为什么会发生这个错误,因为我确实在函数中返回了一个值。
下面是我的C++代码:

  1. #include <stdexcept>
  2. int Largest(int a, int b, int c) {
  3. if (a > b && a > c) {
  4. return a;
  5. }
  6. else if (a < b && b > c) {
  7. return b;
  8. }
  9. else if (a < c && c > b) {
  10. return c;
  11. }
  12. }

任何帮助理解和解决这个错误将不胜感激。

0s7z1bwu

0s7z1bwu1#

考虑这样的一个案例:

  1. int l = Largest(1, 2, 2);

使用这些参数,函数中的任何条件都不会是true

  1. if (a > b && a > c) { // 1 > 2 is false
  2. return a;
  3. }
  4. else if (a < b && b > c) { // 1 < 2 is true, but 2 > 2 is false
  5. return b;
  6. }
  7. else if (a < c && c > b) { // 1 < 2 is true, but 2 > 2 is false
  8. return c;
  9. }

...所以函数将转到末尾 * 而不会 * 返回一个具有未定义行为的int作为结果。
一个简单的修复:

  1. int Largest(int a, int b, int c) {
  2. return std::max(std::max(a, b), c);
  3. }

  1. int Largest(int a, int b, int c) {
  2. return std::max({a,b,c});
  3. }

或更通用:

  1. template<class... Args>
  2. auto Largest(Args&&... args) {
  3. return std::max({std::forward<Args>(args)...});
  4. }
展开查看全部
ctzwtxfj

ctzwtxfj2#

@TedLyngmo的答案解释了问题的来源,以及使用标准库的正确解决方案。
如果您需要自己实现逻辑(出于教育或其他原因),请添加以下答案:

  1. int Largest(int a, int b, int c)
  2. {
  3. if (a >= b && a >= c)
  4. {
  5. return a; // none are larger than a
  6. }
  7. if (b >= a && b >= c)
  8. {
  9. return b; // none are larger than b
  10. }
  11. // If we got here then c is the largest:
  12. return c;
  13. }

Godbolt - demo
请注意,我使用<=而不是<来处理某些值相同的情况。

展开查看全部
mwecs4sa

mwecs4sa3#

如果你的条件都不为真,函数不知道返回什么。您可以简单地删除第三个条件:如果a和B都没有返回,那么总是返回c。

  1. int Largest(int a, int b, int c) {
  2. if (a > b && a > c) {
  3. return a;
  4. }
  5. else if (a < b && b > c) {
  6. return b;
  7. }
  8. return c;
  9. }

相关问题