【问题标题】:Program returning garbage value程序返回垃圾值
【发布时间】:2020-11-27 07:54:23
【问题描述】:

我正在开发一个程序,它使用两个函数 area 和 perimeter 来返回正方形的面积和周长。我编写的以下代码正确返回了区域,但为周长生成了一个垃圾值。你能纠正我做错了什么吗?

#include<iostream>
#include<cmath>
using namespace std;
int area(int s)
{
    int area = s * s;
    return area;
}
double perimeter()
{
    int s;
    int perimeter = 4 * s;
    return perimeter;
}
int main()
{
    int s;
    cout << "enter the side: "
        << endl;
    cin >> s;
    cout << "area of square is "
        << area(s) << endl;
    cout << "perimeter of square 25.  is" << perimeter() << endl;
}

【问题讨论】:

  • 1.切勿在此站点上发布行号代码。如果在错误消息中调用了特定的行号,请使用内联 comment 对其进行标记。 2. 始终正确格式化和缩进本网站上发布的代码。 3. int s; int perimeter = 4*s; ...和s什么 ??这是一个不确定的int。您的代码调用未定义的行为
  • 您介意删除行号以便其他人更容易阅读代码吗?
  • 函数perimeter()声明了一个变量s,它永远不会被初始化,然后被使用。因此,该函数表现出未定义的行为。 perimeter() 中的 s 是一个独特的变量,与 main() 中声明的 sarea() 的参数没有任何关系。
  • 使用正确的编译器标志不会编译godbolt.org/z/cT59dW。编译器是你的朋友,好好利用吧!

标签: c++


【解决方案1】:

您必须将边 s 作为外围函数中的参数传递,例如:

double perimeter(double s){
    return 4 * s
}

你应该使用如下参数调用你的函数:

int main(){
    double s;
    cin >> s;
    cout << "perimeter of square 25. is" << perimeter(s) << endl;
}

让我知道它是否有效。

【讨论】:

    【解决方案2】:

    在您的 perimeter() 函数中,变量 s 未使用值初始化。变量 s 在未初始化时指向内存中的一些垃圾值。出于这个原因,当您将 4 乘以 s(一些垃圾值)时,您得到的值是垃圾。

    您可以更改方法/函数签名,如下所示:

    double perimeter(double s){
        return 4 * s
    }
    

    并调用带有参数的函数。

     int square; 
     cin>>square;
     cout << "perimeter of square 25.  is" << perimeter(square) << endl;
    

    或者你可以简单地声明一个全局变量来保存你想要的周长的平方值。

    int square;
    int main()
    {
      cin>> square;  
      cout << "perimeter of square 25.  is" << perimeter() << endl; 
    }
    

    【讨论】:

    • (nitpick)“变量 s 指向内存中的一些垃圾值”这有点误导。当我们谈论 C++ 时,没有垃圾值。代码具有未定义的行为。就是这样。当我们谈论编译器对代码做了什么以及生成的程序如何表现时,我们应该查看编译器输出而不是 C++ 代码以了解发生了什么
    • 那么,根据您的说法,垃圾值这个词是从哪里来的?它的意义是什么?当你声明一个没有初始化的变量时,它主要持有什么值?
    • 恕我直言,“垃圾”一词在这种情况下是一个误导性的神话。当代码有 ub 时,根据标准来推理代码的作用没有多大意义,因为根据定义,代码的作用是未定义的。当您要求编译器对其进行编译时,生成的程序会做什么是另一回事。你得到的通常是某个内存位置的内容。而且我的计算机内存中没有“垃圾”;)
    • 它来自哪里?可能人们希望得到一些有意义的东西,但得到一些别的东西,然后称之为“垃圾”,但事实并非如此。如果您研究程序集,您会发现值来自哪里