作为一个业余程序员,这让我很困惑。我可能只是错过了一些东西。在我见过这样的 C++ 代码中:
while (cin.get(c)) {...}
几乎就像是一个 try 语句。如果语句成功,就像函数返回true,如果不成功,就像它返回false。我见过很多这样的事情,有时是用其他语言。它是如何工作的?我只是错过了一些东西(比如如果它不起作用,则返回 false 的函数。)?如果不是,这是否适用于所有语言?
作为一个业余程序员,这让我很困惑。我可能只是错过了一些东西。在我见过这样的 C++ 代码中:
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“字符”(^C => Ctrl+C)在 Windows 中)。
一个if
语句评估一个表达式是否为真......一个真正的表达式可以直接评估为具有 value 的布尔值true
,或者可以隐式转换为的某个值true
(例如,如果非 0,则数字/指针值是 true)。
函数可以返回true
or 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
根据其状态转换为具有值的值。
我明白为什么它可能是一个意想不到的习语,但它确实产生了一些富有表现力的代码。