2012-08-14 63 views
0

作为一个专业程序员,这使我感到困惑。我可能只是想念一些东西。在C++代码中,我已经看到类似这样的东西:C++ while语句的失败函数?

while (cin.get(c)) {...} 

几乎就好像它是一个try语句。如果语句成功,就像函数返回true,否则返回false。我已经看过很多这样的东西,有时用其他语言。它是如何工作的?我只是缺少一些东西(比如函数返回false,如果它不起作用)。如果不是,这是否适用于所有语言?

+0

我认为你在找什么,是沿着“真理”和“虚假”的价值观。这些因语言而异......例如,0是“假”值(在C/C++/JavaScript/etc中),而其他每个整数都是“真值”值。 – 2012-08-14 00:51:50

+0

'cin.get()'读取包含空格的单个字符并将其存储在变量中,在您的情况c。它也可以被称为'c = cin.get()'。您也可以使用cin.get()来暂停屏幕,直到用户按下ENTER键。知道并没有看到这个例子,似乎是一个无限循环。 – ChiefTwoPencils 2012-08-14 01:02:43

+0

@RobertoWilko在我看来,就像循环直到EOF(ctrl + D)一样。 – 2012-08-14 01:05:24

回答

0

看一看:http://www.cplusplus.com/reference/iostream/istream/get/ 您使用的版本是第二个(istream& get (char& c);)。在C++中,正如pst所说的,任何不同的0或NULL值都是真的,否则它将是错误的。在你的情况下,每次调用cin.get将返回* this,这将是真实的,所以,你将得到一个无限循环,直到发生一些“问题”,比如读取EOF“char”(^ C => Ctrl + C)在Windows中)。

+0

如果它完全遇到问题,它会返回什么?它只是提出一个错误? – 2012-08-14 01:39:35

+0

@Mike:当问题发生时,流自身设置标志(取决于错误的类型)并且仍然返回自身。流有一个运算符将自己转换为'bool'或'void *'(我忘了),并且如果设置了这些标志,那么该运算符会返回一个falsy值(分别为“false”或null)。 – cHao 2012-08-14 02:04:42

+0

@cHao好的,谢谢。 – 2012-08-14 02:11:13

3

一个C++参考文件会注意到get(char_type &)方法的返回值是*this,其类型为basic_istream &1)。 basic_istream继承自basic_ios,它具有一个转换运算符,如果存在I/O故障,则返回false,否则返回true(2)。

0

一种if语句计算的表达式真理...真实地表达可以与值true直接评估为布尔值,或在一定值,该值可以被隐式转换为true(例如,数字/指针的值是如果不是0,则为true)。

函数可以返回truefalse,或返回某个具有转换运算符的对象为布尔类型或数值类型。

在这种情况下,cin.get(c)返回到cin对象,该对象可以被隐式转换为布尔的基准(来自void* - 见http://www.cplusplus.com/reference/iostream/ios/operator_voidpt/)来检查输入操作的成功或失败。

这不适用于所有函数或所有语言 - 它只适用于那些恰好返回布尔值或数值的函数,这样才有意义进行测试。例如:

if (std::cin >> a >> b) // true if both inputted successfully... 

if (my_vector.capacity()) // useless? - capacity may be >0 "true" irrespective of size() 

if (my_vector.empty())  // makes sense - returns a boolean 

if (my_vector.size())  // makes sense - returns a number, non-0 is "true" 
          // dubious style as a change from vector to list would require 
          // a change to !empty() to maintain O(1) performance in C++03 
0

IOStreams库是故意用这种方式设计的。这些操作会返回对正在操作的流的引用,并且该流可根据其状态转换为值为bool的值。

我明白了为什么它可能是一个意想不到的成语,但它确实为一些富有表现力的代码。