【问题标题】:I want to know why it give me that error? [duplicate]我想知道为什么它给我这个错误? [复制]
【发布时间】:2021-05-11 06:16:09
【问题描述】:

我正在使用一个函数来返回一个整数向量,但问题是,如果我在 if 语句中键入 return out,它会给我一个错误。如果我从 for 循环中输入它,代码就可以工作。在 if 语句生效后,我需要强制循环停止并返回输出向量。

vector<int> icecreamParlor(int m, vector<int> arr) {
    vector<int> out;
    for(int i = 0 ; i < arr.size(); i++){
        int x  = arr [i];
        for(int z = 1 ; z < arr.size(); z++){
            if(x + arr[z] == m){
                out.push_back(i+1);
                out.push_back(z+1);
                return out;
            }
        }
    }
} 

这是错误消息

Solution.cpp: In function ‘std::vector<int> icecreamParlor(int, std::vector<int>)’:
Solution.cpp:10:23: warning: comparison of integer expressions of different signedness: ‘int’ and ‘std::vector<int>::size_type’ {aka ‘long unsigned int’} [-Wsign-compare]
     for(int i = 0 ; i < arr.size(); i ++){

【问题讨论】:

  • 如果条件x + arr[z] == m永远不为真,那你会返回什么?
  • 并非所有代码路径都返回值。您可能想在第一个循环完成后而不是在循环内返回?
  • 你实际上得到了什么错误?请edit 您的问题包括错误的fullcomplete 复制粘贴。最好是 minimal reproducible example 来解决错误。
  • 通常,错误本身会告诉您给出它的原因。它被称为“错误消息”。
  • 快速修复您显示的 警告(不应该是唯一的):for (size_t i = 0; ...z 的第二个循环相同。

标签: c++ if-statement vector return


【解决方案1】:

引用的“错误”(实际上是警告)是关于

 i < arr.size()

不幸的是。向量的size() 函数,由于历史原因,返回一个无符号类型。在比较有符号和无符号整数时,有符号整数会转换为无符号整数,可能会产生灾难性的结果(如果它实际上是负数)。因此发出警告。你可以

  • 使用新的ssize() 成员函数,它与size 相同,但返回一个有符号整数。
  • 也将i 声明为无符号(但在使用反向迭代时要小心)
  • size() 转换为有符号整数:i &lt; (int)v.size()

我怀疑您的编译器还必须警告您并非函数的所有控制路径都返回值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    • 2021-04-06
    • 2014-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多