2

我正在浏览关于 C++ 的谷歌大学部分,但我不确定这段代码的作用:

if (!(cin >> input_var)) {

    cout << "you entered a non-numeric. Exiting..." << endl;
    break;

}

if 语句中的语句在这里实际上做了什么?

谢谢!

4

8 回答 8

7

这是非常基本的 C++。通常,>><<用于位移。但是,I/O 流库已重载operator>>operator<<for 流,因此它们可以分别用于提取插入。为什么?因为操作符看起来像两个有方向性的箭头,所以代码读起来很好——数据正朝着那个方向移动。

因此,在您的示例中,cin是标准输入流,并且您正在从该流中提取一个整数到变量input_var中。您读cin >> input_var作“input_var从标准输入中提取”。

同样,在if语句的主体内,您将插入到标准输出流中,cout.

I/O 重载operator<<operator>>返回对您从中提取或插入的流的引用。此流可转换bool为允许您检查其状态。也就是说,doingif (cin)将检查cin流的状态是否正常。在您的情况下,我们使用“not”运算符!来检查流是否正常。如果不是,我们输出错误。

值得一提的是,语句!(cin >> input_var)内部if并不是语句本身——它是一个表达式。

于 2012-12-18T16:49:11.570 回答
3

它读取一个int(变量)并通过部件(有一个重载)input_var检查读取是否成功。!(cin >> ...)istreamoperator !

于 2012-12-18T16:48:24.567 回答
2
if ( !(cin >> input_var) )

>>是一个为 重载的运算符std::istream&,并根据input_var特定重载的类型调用它从流中读取数据并存储在 中input_var。运算符重载返回类型是std::istream&,表示表达式的类型cin >> input_varstd::istream&,当在ifor中使用时while,可以根据从流中读取是否成功自动转换为trueor 。false因此,您可以在任何需要布尔表达式的构造中编写它,例如ifand while

if ( cin >> data )
{
     //this block will execute only if the data was successfully read
}

相似地,

while ( cin >> data )
{
     //this block will execute only if the data was successfully read
     //and the loop will continue until read attempt fails.
}
于 2012-12-18T16:49:20.293 回答
2

cin >> input_var提示用户输入保存在input_var. 如果接收到的输入不是整数,那么它会进入 if 条件。“考虑到变量是一个int。”

于 2012-12-18T16:50:32.403 回答
1

在 iostream 的上下文中,作者通常将 << 和 >> 分别称为“put-to”或“流插入”和“get-from”或“流提取”运算符。

如果在操作数之间使用 >> 表示其按位右移

于 2012-12-18T16:49:46.097 回答
1

>>运算符根据上下文有两种含义。

当使用整数时,它可以是右移运算符:1024 >> 3执行位移。

在您的情况下,您会认为它是“提取运算符”。从 中提取时cin,程序从标准输入(通常是键盘)读取并尝试将其格式化为适合右侧的内容。由于您正在读取整数,因此它将执行以下步骤:

  • 读取并丢弃任何前面的空格
  • 阅读和解释一个+-作为一个积极或消极的符号
  • 读取尽可能多的数字字符来构建一个整数。

如果 if 可以读取某些内容并生成一个整数,则该过程最终会返回评估为 true 的内容,因此该行:

if(!(cin >> input_var))

Checks to see if the conversion succeeded. If it couldn't read a number, say you entered fred instead, the process would return something that evaluates to false, since the conversion failed. The value returned is actually cin, which is convertible to bool, but that's a little down in the weeds.

于 2012-12-18T16:51:45.000 回答
0

这是一个重载的运算符。

  • 对于输入,提取运算符为cin>>value;

  • 用于按位右移value>>2;

于 2012-12-18T16:50:28.137 回答
0

它是一个运算符。行为取决于 input_var。看看这里:MSDN

于 2012-12-18T16:51:29.393 回答