0

作为一个业余程序员,这让我很困惑。我可能只是错过了一些东西。在我见过这样的 C++ 代码中:

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

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

4

4 回答 4

3

C++ 参考会注意到该get(char_type &)方法的返回值是*this类型basic_istream &( 1 )。basic_istream继承自whichbasic_ios有一个转换运算符,如果 I/O 失败,则基本上返回 false,否则返回 true ( 2 )。

于 2012-08-14T01:00:48.157 回答
0

看看这里:http ://www.cplusplus.com/reference/iostream/istream/get/ 您使用的版本是第二个(istream& get ( char& c );)。在 C++ 中,正如 pst 所说,任何不同于 0 或 NULL 的值都将为真,否则将为假。在您的情况下,每次调用 cin.get 都会返回 *this,这将是真的,因此,您将获得一个无限循环,直到出现一些“问题”,例如读取 EOF“字符”(^C => Ctrl+C)在 Windows 中)。

于 2012-08-14T01:02:34.723 回答
0

一个if语句评估一个表达式是否为真......一个真正的表达式可以直接评估为具有 value 的布尔值true,或者可以隐式转换为的某个值true(例如,如果非 0,则数字/指针值是 true)。

函数可以返回trueor 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
于 2012-08-14T01:41:45.937 回答
0

IOStreams 库是故意这样设计的。这些操作返回对您正在操作的流的引用,并且流可以bool根据其状态转换为具有值的值。

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

于 2014-04-28T19:15:40.927 回答