【问题标题】:Can a variable be initialized with an istream on the same line it is declared? [duplicate]可以在声明的同一行上使用 istream 初始化变量吗? [复制]
【发布时间】:2013-02-01 14:35:17
【问题描述】:

下面两行可以浓缩成一条吗?

int foo;
std::cin >> foo;

【问题讨论】:

  • 可能是int old; std::cin >> old;?
  • 我重新命名了这个古老而尴尬的问题,因为它最近受到了很多关注。

标签: c++ int cin


【解决方案1】:

聪明的答案:

int old; std::cin >> old;

可怕的答案:

int old, dummy = (std::cin >> old, 0);

正确答案:old 必须先用 声明 定义,然后才能作为参数传递给 operator>>。在变量声明中获取函数调用的唯一方法是将其放在上面的初始化表达式中。声明变量并将输入读取到其中的公认方法是您所写的:

int old;
std::cin >> old;

【讨论】:

  • 聪明的回答,哈哈。谢谢,内容丰富
  • , 0 是多余的; - istream 隐式转换为整数类型
【解决方案2】:

你可以……用

int old = (std::cin >> old, old);

但你真的不应该这样做

【讨论】:

  • 啊,好点子!聪明。
  • @6502 为什么我们不应该按你说的做??
  • @Mohammasd • 因为如果std::cin >> old 失败(即返回false),则old 未初始化,然后读取old(第二部分,逗号运算符之后)是未定义的行为。未定义的行为是不好的。
  • 关于未定义的行为,此示例与stackoverflow.com/a/1615656/2725810 中的示例 a) 有何不同?
  • @AlwaysLearning: 1) 不幸的是,虽然有一些重要的相关性,但投票数或作者的代表并不意味着答案是正确的......没有理由让你的大脑关闭并且只是从SO粘贴。 2) 在str 示例中,他/她正在使用从未未初始化的std::string(即,int x; return x; 之类的代码是未定义的行为,std::string s; return s; 则可以)。
【解决方案3】:

使用函数:

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进行操作!
  • @JosephMansfield 我认为,在最初的问题中,有时您只想将变量初始化为用户输入值,而不是系统默认值、未定义值或您自己拒绝的值定义。不过,出于data 的目的,我觉得没有必要对它“做同样的事情”,因为它只会在所有三行执行时间的函数的本地范围内存在,也许如果函数被标记作为内联,它甚至可以完全优化掉。如果发生这种情况,int old = inputdata(); 可能最终等同于 int old; std::cin >> old;
【解决方案4】:

也许不是针对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);
}

【讨论】:

    猜你喜欢
    • 2019-05-02
    • 2020-07-02
    • 2012-01-28
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    相关资源
    最近更新 更多