将未初始化的局部变量传递给函数时,C ++编译器警告(?)

时间:2012-02-01 07:45:58

标签: c++ variables local initialization

我对C ++很陌生,所以我希望有人能说清楚。我遇到了几个类似的主题,但我只需要澄清。

因此,将已声明但未初始化的本地字符串传递给函数似乎是有效的。但是为什么编译器在尝试使用int或float时会抱怨?

无论是字符串,浮点数还是int,内存地址在被声明时都被引用,即使它可能是“垃圾”

#include <iostream>
using namespace std;

void load(int);

int main()
{
    int salary;
    load(salary);
    return 0;
}

void load(int sal)
{
    cout << "your salary: " << endl;
    cin >> sal;
    cout << sal << endl;
}

如果我将int或float声明为全局变量,它将按预期工作,不会发出任何警告。 那么在全局空间中声明变量是一种更好的做法(我希望不是这样)?

所以把它放在全球范围内,它有效:

#include <iostream>
using namespace std;

int salary;
void load(int);

int main()
{
    load(salary);
    return 0;
}

void load(int sal)
{
    cout << "your salary: " << endl;
    cin >> sal;
    cout << sal << endl;
}

好的,另一个显示未初始化的全局变量在传递给函数作为值时起作用的示例:(脱离David的评论)

int foo; 
int returnit(int j)
{ 
    cout << "your salary";
    cin >> j;
    return j; 
} 
int main() 
{ 
    int k = returnit(foo);
    cout << k; 
    return 0;
} 

无论如何,这里的教训是在传递给函数之前初始化原始数据类型。

4 个答案:

答案 0 :(得分:6)

  

因此,将已声明但未初始化的本地字符串传递给函数似乎是有效的。但是为什么编译器在尝试使用int或float时会抱怨?

如果用“string”表示std::string对象,那是因为对象永远不会被初始化。当你这样做时:

std::string s;

然后调用std::string的默认构造函数,并初始化该对象。

原始数据类型的变量(例如intfloat),除非声明具有静态存储持续时间,否则如果没有显式初始化则会有垃圾。尝试阅读和使用该垃圾正确地触发警告。 (具有静态存储持续时间的原始数据类型的变量(即,全局变量或声明为static的变量)被隐式初始化为0.)

  

那么在全局空间中声明变量是一种更好的做法(我希望不是这样)?

不,更好的做法是初始化变量。

答案 1 :(得分:2)

解释为什么永远不要在函数调用中使用未初始化变量的最好方法是因为这在逻辑上是无效的,有时逻辑上都是无效的,语法无效。

要查看您的程序在逻辑上是否有效,请使用box方法并跟踪您的程序。全局框中包含全局变量,int main有自己的框来保存其局部变量,当调用函数时,为该函数创建一个新框并用其参数和局部变量填充它。逐行进行并在程序中更改变量值时更改它们。请记住只使用常量作为全局变量。当你通过引用传递一个函数时要小心,你知道函数被赋予变量在内存中寻址并且可以改变那个值。使用pass by value时,请在函数声明中使用这种语法:

int Multiplication(const int Var1, const int Var2);

这可以保护你传递给乘法的值.c ++的语法是为了速度而制定的,它不会让你在逻辑上不正确。

答案 2 :(得分:1)

int salary;
load(salary);

您认为您在这里传递给load有什么价值?你传递的是无意义的价值。

要清楚,您没有传递“未初始化的变量”,而是传递未初始化变量的。如果你这样做:

int j=3;
load(j);

您将j的值(即3)传递给load。如果没有另外指定,则C ++按值传递。

全局变量存在同样的问题:

int foo;

int returnit(int j)
{
    return j;
}

int main(void)
{
    int j=returnit(foo);

您认为j应该具有什么价值?!在将变量传递给函数之前,您仍然需要将变量初始化为某个特定值。

答案 3 :(得分:0)

再加上David的答案,你可能想做的事(我猜)是修改原来的薪水变量。为此,您需要传递对变量的引用,如下所示:

void load(int& sal)
{
    cout << "your salary: " << endl;
    cin >> sal;
    cout << sal << endl;
}

请注意'&amp;'在函数签名中的int之后。

另请注意,您在load()中使用'salary',而未定义它。你应该使用'sal'来代替。

这样编译器知道load()接收对变量的引用,所以如果你在函数内修改它,你发送给函数的变量(salary)也会改变。

对函数的调用本身保持不变。