c while()..执行代码行的条件

C++ while() ... condition on the execution of a line of code

本文关键字:条件 代码 执行 while      更新时间:2023-10-16

给定链接列表的头部,当穿过链接列表以计算列表的大小时,可以做的常见方法可能是

ListNode* curr = head;
int count = 0;
while(curr) {
    curr = curr->next;
    count++;
}

,但我也看到人们这样做:

ListNode* curr = head;
int count = 0;
while(curr = curr->next) {
    count++;
}

我记得在解析字符串中,我们经常做

stringstream content(intputStr);
string outputStr;
while(content >> outputStr) {
    ...
}

我想知道我可以始终在执行一行代码(在本主题中,curr = curr->下一个条件)的执行情况下始终调节我的时()吗?如果没有,边缘案件是什么?这是一个好习惯吗?

谢谢

在C 中,操作员可以像函数一样具有返回值。您是否可以将表达式用作条件完全取决于它们返回的内容。为此,您必须咨询文档。

在分配中: a = b,默认行为是返回 b的值;这就是这样,诸如a = b = c = 5之类的链分配将起作用。

该表达式等效于a = (b = (c = 5))c = 5将返回5,表达式变为a = (b = 5)b = 5返回5,因此,该表达式再次变为a = 5,从而将5分配给abc

可以将流对象直接评估为布尔,因为它旨在通过覆盖的bool操作员进行。

在流对象上的>>操作员的情况下,该操作员被覆盖以返回流对象,因此在以下内容中,while (cin >> userInput)cin >> userInput返回cin,它将产生true或false。

这是好习惯吗?

我仍然是一名大学生,因此需要服用盐分。就流而言,我会说这是一个很好的做法,因为这是一个众所周知的事情。大多数人可以说出您打算直接做的事情,而替代方案并不清楚。

至于作业,我倾向于否,但这取决于谁在阅读您的代码和您在做什么。如果使用太多,可能很难区分诸如if (userInput = 5)if (userInput == 5)之类的东西,这使得很难找到错误。

基本概念是,while循环内部的表达式必须可转换为 bool

curr = curr->next表达式通过参考返回表达式的左侧(请参阅链式作业)。表达式的左侧是指针,可转换为布尔值。如果指针等于 nullptr,则转换后的布尔值将是一个错误,否则将是真实的。

表达式content >> outputStr返回对content流的引用。这就是为什么您可以像这样

链接>>操作员的原因
cin >> a >> b;

cin >> a返回对cin对象的引用,因此表达式的评估如下

cin >> a;
cin >> b;

cin对象具有一个成员函数定义,允许其转换为布尔表达式(http://en.cppreference.com/w/cpp/io/basic_ios/operator_bool),因此您可以做类似的事情这个

cin >> a;
cout << "cin has failed (true/false) : " << std::boolalpha << static_cast<bool>(cin) << endl;
// static_cast<bool>(cin) is the same as cin.(operator bool()) 
// if that syntax exists

使用operator bool()方法将cin对象转换为布尔表达式。像if()语句或while()中的布尔表达中的某些东西被转换为布尔值。

我想知道我可以始终在执行一行代码(在本主题中,curr = curr->下一个条件)的执行情况下始终调节我的时()吗?如果没有,边缘案件是什么?这是一个好习惯吗?

您可以这样做,如果表达式可转换为bool,并且在许多情况下,将表达式嵌入循环中的是惯用"转换为bool"功能的习惯使用。边缘案例取决于表达式的实现细节。

您的示例有点扭曲,但至于您的问题:

我可以始终在执行一行代码(在本主题中,条件= curr->下一个条件)的执行情况下调节我的()吗?如果没有,边缘情况是什么?

while中的条件可以是隐式转换为bool的任何表达式。在您的示例中," curr = curr->next"评估了一个适合此要求的指针。

这是一个好习惯吗?

不让您感到困惑的代码是很好的实践。