C++ 变量可以在声明的同一行上用istream初始化吗?
以下两行可以压缩成一行吗C++ 变量可以在声明的同一行上用istream初始化吗?,c++,int,cin,C++,Int,Cin,以下两行可以压缩成一行吗 int foo; std::cin >> foo; 聪明的回答是: int old; std::cin >> old; 可怕的答案是: int old, dummy = (std::cin >> old, 0); 正确的答案是:old必须先用声明定义,然后才能作为参数传递给操作符>。在变量声明中获取函数调用的唯一方法是将其放置在初始化表达式中,如上所述。声明变量并将输入读入变量的公认方法如下: int old; std::cin
int foo;
std::cin >> foo;
聪明的回答是:
int old; std::cin >> old;
可怕的答案是:
int old, dummy = (std::cin >> old, 0);
正确的答案是:old
必须先用声明定义,然后才能作为参数传递给操作符>
。在变量声明中获取函数调用的唯一方法是将其放置在初始化表达式中,如上所述。声明变量并将输入读入变量的公认方法如下:
int old;
std::cin >> old;
你可以。。。与
int old = (std::cin >> old, old);
但您确实不应该使用函数来执行此操作:
int inputdata()
{
int data;
std::cin >> data;
return data;
}
然后:
对于数据本身:
int inputdata()
{
static bool isDataDeclared=false;
if (isDataDeclared==true)
{
goto read_data;
}
else
{
isDataDeclared=true;
}
static int data=inputdata();
return data;
read_data:
std::cin >> data;
return data;
}
可能不是针对
int
,而是针对您自己的类型:
class MyType {
int value;
public:
MyType(istream& is) {
is >> *this;
}
friend istream& operator>>(istream& is, MyType& object);
};
istream& operator>>(istream& is, MyType& object) {
return is >> object.value;
}
然后可以使用传递给构造函数的istream
创建类型:
int main() {
istringstream iss("42");
MyType object(iss);
}
可能
int-old;旧的代码>?我重新命名了这个令人尴尬的老问题,因为它最近受到了很多关注。聪明的回答,哈哈。谢谢,这是信息,0
是多余的;-<代码>istream
隐式转换为整数类型啊,很好!聪明。@6502为什么我们不应该照你说的做???@Mohammasd•因为如果std::cin>>old
失败(即返回false),那么old
没有初始化,然后读取old
(逗号运算符后的第二部分)是未定义的行为。而未定义的行为是不好的。关于未定义的行为,这个例子与例子a)在投票率高的情况下有何不同?@AlwaysLearning:1)不幸的是,虽然存在一些重要的相关性,但投票数或作者的代表并不意味着答案是正确的。。。没有理由关闭你的大脑,只是从中粘贴。2) 在str
示例中,他/她使用的std::string
从来都不是未初始化的(即int x;return x;
这样的代码是未定义的行为,std::string s;return s;
是可以的)。但是现在也对数据
这样做@JosephMansfield我认为,在最初的问题中,有时候你只想将一个变量初始化为一个用户输入值,而不是系统默认值,一个未定义的值或你自己拒绝定义的值。不过,出于数据的目的,我觉得没有必要对它“做同样的事情”,因为它只会在函数的局部范围内存在于所有三行执行时间中,如果函数被标记为内联,它甚至可能会被完全优化掉int old=inputdata()代码>可能最终等同于int old;旧的代码>如果发生这种情况。
int main() {
istringstream iss("42");
MyType object(iss);
}