作为一个专业程序员,这使我感到困惑。我可能只是想念一些东西。在C++代码中,我已经看到类似这样的东西:C++ while语句的失败函数?
while (cin.get(c)) {...}
几乎就好像它是一个try语句。如果语句成功,就像函数返回true,否则返回false。我已经看过很多这样的东西,有时用其他语言。它是如何工作的?我只是缺少一些东西(比如函数返回false,如果它不起作用)。如果不是,这是否适用于所有语言?
作为一个专业程序员,这使我感到困惑。我可能只是想念一些东西。在C++代码中,我已经看到类似这样的东西:C++ while语句的失败函数?
while (cin.get(c)) {...}
几乎就好像它是一个try语句。如果语句成功,就像函数返回true,否则返回false。我已经看过很多这样的东西,有时用其他语言。它是如何工作的?我只是缺少一些东西(比如函数返回false,如果它不起作用)。如果不是,这是否适用于所有语言?
看一看: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中)。
如果它完全遇到问题,它会返回什么?它只是提出一个错误? – 2012-08-14 01:39:35
@Mike:当问题发生时,流自身设置标志(取决于错误的类型)并且仍然返回自身。流有一个运算符将自己转换为'bool'或'void *'(我忘了),并且如果设置了这些标志,那么该运算符会返回一个falsy值(分别为“false”或null)。 – cHao 2012-08-14 02:04:42
@cHao好的,谢谢。 – 2012-08-14 02:11:13
一种if
语句计算的表达式真理...真实地表达可以与值true
直接评估为布尔值,或在一定值,该值可以被隐式转换为true
(例如,数字/指针的值是如果不是0,则为true)。
函数可以返回true
或false
,或返回某个具有转换运算符的对象为布尔类型或数值类型。
在这种情况下,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
IOStreams库是故意用这种方式设计的。这些操作会返回对正在操作的流的引用,并且该流可根据其状态转换为值为bool
的值。
我明白了为什么它可能是一个意想不到的成语,但它确实为一些富有表现力的代码。
我认为你在找什么,是沿着“真理”和“虚假”的价值观。这些因语言而异......例如,0是“假”值(在C/C++/JavaScript/etc中),而其他每个整数都是“真值”值。 – 2012-08-14 00:51:50
'cin.get()'读取包含空格的单个字符并将其存储在变量中,在您的情况c。它也可以被称为'c = cin.get()'。您也可以使用cin.get()来暂停屏幕,直到用户按下ENTER键。知道并没有看到这个例子,似乎是一个无限循环。 – ChiefTwoPencils 2012-08-14 01:02:43
@RobertoWilko在我看来,就像循环直到EOF(ctrl + D)一样。 – 2012-08-14 01:05:24