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

WJR*_*WJR 0 c++ variables initialization local

我对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;
}
Run Code Online (Sandbox Code Playgroud)

如果我将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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

jam*_*lin 6

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

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

std::string s;
Run Code Online (Sandbox Code Playgroud)

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

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

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

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