一个关于cin的问题(一次输入两次调用?)

问题描述 投票:0回答:1

我正在接触一些 C++,并且正在阅读一个介绍,其中这段代码片段让我有点想知道:

cout << "\nPlease enter an article label: ";

// Input the label (15 characters maximum):
cin >> setw(16);       // or: cin.width(16);
cin >> label;

作者没有告诉我为什么对于一根输入线我需要(或可以使用)两次

cin
,一次带有操纵器,一次带有修改的地方?

现在,在关于流的第 4 章中,根据我到目前为止所读到的内容,我预计这是两个单独的实例,因此会执行操作。因此,在我天真的阶段,我会写:

cin >> setw(16) >> label;  // according to: cout << setw(16) << label;

你能向我解释一下,为什么两次

cin
结果只有一行输入吗?看起来,这里提出的类似问题不够相似 - 经过检查后。

我可以简单地接受并复制它。但我想了解一下。

是否只是因为在带有

cin
的第一行中没有地方可以写入输入 2,因此它创建了该字段,然后从第二行中的 cin 中“使用”该字段?如果是这样,是否有充分的理由将其分成两行?

c++ cin
1个回答
0
投票
cin >> setw(16);
cin >> label;

执行方式与:

相同
cin >> setw(16) >> label;

它的工作原理如下:

    首先执行
  • cin >> setw(16)
    。 这是对继承的
    istream
    成员函数的调用:
    istream& operator>>( std::ios&(*func)(std::ios&) );
    
    setw(16)
    在这里被视为
    func
    ,它是一个指向函数的指针,该函数在调用时采用
    std::ios&
    参数。
    std::cin
    源自
    std::ios

    operator>>
    cin
    成员函数内,它将调用
    func
    并将对其自身的引用作为参数传递:
    func(*this);
    
    func
    会依次执行以下操作:
    std::istream& func(std::istream& stream) {
        stream.width(16);
        return stream;
    } 
    
    最后
    operator>>
    返回对
    *this
    的引用,这是我们的
    cin
  • 下一个要处理的操作数是
    label
    ,并且由于
    cin
    是从第一个操作返回的,所以剩下的只是
    cin >> label
    
© www.soinside.com 2019 - 2024. All rights reserved.