【发布时间】:2013-02-01 14:35:17
【问题描述】:
下面两行可以浓缩成一条吗?
int foo;
std::cin >> foo;
【问题讨论】:
-
可能是
int old; std::cin >> old;? -
我重新命名了这个古老而尴尬的问题,因为它最近受到了很多关注。
下面两行可以浓缩成一条吗?
int foo;
std::cin >> foo;
【问题讨论】:
int old; std::cin >> old;?
聪明的答案:
int old; std::cin >> old;
可怕的答案:
int old, dummy = (std::cin >> old, 0);
正确答案:old 必须先用 声明 定义,然后才能作为参数传递给 operator>>。在变量声明中获取函数调用的唯一方法是将其放在上面的初始化表达式中。声明变量并将输入读取到其中的公认方法是您所写的:
int old;
std::cin >> old;
【讨论】:
, 0 是多余的; - istream 隐式转换为整数类型
你可以……用
int old = (std::cin >> old, old);
但你真的不应该这样做
【讨论】:
std::cin >> old 失败(即返回false),则old 未初始化,然后读取old(第二部分,逗号运算符之后)是未定义的行为。未定义的行为是不好的。
str 示例中,他/她正在使用从未未初始化的std::string(即,int x; return x; 之类的代码是未定义的行为,std::string s; return s; 则可以)。
使用函数:
int inputdata()
{
int data;
std::cin >> data;
return data;
}
然后:
int a=inputdata();
对于数据本身:
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;
}
【讨论】:
data进行操作!
data 的目的,我觉得没有必要对它“做同样的事情”,因为它只会在所有三行执行时间的函数的本地范围内存在,也许如果函数被标记作为内联,它甚至可以完全优化掉。如果发生这种情况,int old = inputdata(); 可能最终等同于 int old; std::cin >> old;。
也许不是针对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);
}
【讨论】: