Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ “的含义;而(!(cin>;>;x)|(cin.peek()!=';\n';)|x<;=0)";关于C++;_C++ - Fatal编程技术网

C++ “的含义;而(!(cin>;>;x)|(cin.peek()!=';\n';)|x<;=0)";关于C++;

C++ “的含义;而(!(cin>;>;x)|(cin.peek()!=';\n';)|x<;=0)";关于C++;,c++,C++,我得到了一个代码,以避免任何符号输入,尽管有“int”字符 请一步一步地告诉我这里到底发生了什么 while (!(cin >> x) || (cin.peek() != '\n') || x <= 0) // What is happening here? { cin.clear(); // What is happening here? while (ci

我得到了一个代码,以避免任何符号输入,尽管有“int”字符

请一步一步地告诉我这里到底发生了什么

    while (!(cin >> x) || (cin.peek() != '\n') || x <= 0)
            // What is happening here?
        {
            cin.clear();
            // What is happening here?
            while (cin.get() != '\n');
            // What is happening here?
            cout << "Error. Not a Natural number. Try one more time" << endl;

while(!(cin>>x)| |(cin.peek()!='\n')| | x代码只是验证循环中的输入,丢弃不需要的输入


while(…)

应该是自解释的。循环直到其操作数的计算结果为
false

| |

如果.2个操作数中至少有1个计算结果为
true
,则其计算结果为
true
,否则为
false

!(cin>>x)

将值读入
x
。如果由于I/O错误导致读取失败,或者如果输入的值与
x
的数据类型不匹配,
cin
将进入错误状态。
>
返回对调用它的
std::ostream
的引用(即
cin
)。如果流处于错误状态,则对该流应用
运算符!
将计算为
true
,否则计算为
false

(cin.peek()!='\n')

查看下一个输入的字符是否为换行符(例如,在输入缓冲区中删除字符后的换行符)

由于,如果
>
未能将值读入
x
,则无法达到此表达式

x>
无法将值读入
x
,或者
peek()
不返回
'\n'

cin.clear();

重置
cin
的错误状态,例如如果
>
失败

while(cin.get()!='\n');

读取并丢弃输入,直到遇到换行符(Enter)


我是否可以对这个问题进行投票,因为我不认为这里发生的事情对一个不熟悉这种语言或易于搜索的人来说是显而易见的。@dre这可能是真的,但是“向我解释一下”的问题问题是,在不知道OP缺少什么知识的情况下,我们如何编写一个有用的答案?他们知道
cin>>x
做什么吗?他们知道
cin.operator>>的返回是如何进行的()
有效?他们知道砰的一声正在对返回布尔进行隐式转换,然后翻转它吗?他们有没有尝试查找
cin.clear()
的功能?是什么让他们在文档中感到困惑?你明白我在说什么吗?“因为”短路评估““,只有当>>成功地将一个值读入x,并且如果peek()返回“\n.”时,才达到此表达式-如果存在
&&
,而不是
|
@Fureeish,则会出现这种情况,
false
值短路
&
,而
|
则相反。”(也就是说,任何
true
值都会短路)。因此,雷米说如果
!(cin>>x)
为true或
(cin.peek()!='\n')
为true,那么
x@scohe001 my bad,混合了句子和代码中的否定词是正确的。@fureish我更新了我的答案以澄清这些陈述。