【问题标题】:C++ while() ... condition on the execution of a line of codeC++ while() ... 执行一行代码的条件
【发布时间】:2017-05-13 06:47:33
【问题描述】:

给定链表的头部,遍历链表计算链表的大小时,常见的做法可能是

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->next)?如果没有,边缘情况是什么?这是一个好的做法吗?

谢谢

【问题讨论】:

  • if 请教什么?
  • 什么if?您的帖子不包含任何内容。
  • 您“也看到人们做的”与您最初看到的不同。这两个循环不相同。
  • b = c 表达式本身的值为c,因此您可以执行a = b = c 之类的操作,将c 的值分配给a 和b。这也是使if/while (cur = cur->next) { ... } 成为可能的原因。
  • 你的第二个代码 sn-p 都是错误的(计数减一),如果在空列表上调用会崩溃...

标签: c++


【解决方案1】:

你的例子有点扭曲,但至于你的问题:

我是否可以始终以执行一行代码为条件(例如,在本主题中,条件为 curr = curr->next)?如果不是,边缘情况是什么?

while 中的条件可以是任何可隐式转换为 bool 的表达式。在您的示例中,“curr = curr->next”的计算结果为符合此要求的指针。

这是一个好的做法吗?

不会让您感到困惑的代码是一种很好的做法。

【讨论】:

    【解决方案2】:

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

    在赋值:a = b 中,默认行为是返回 b 的任何值;这样a = b = c = 5 这样的链式分配就可以工作了。

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

    流对象可以直接作为布尔值计算,因为它是 designed to do so 通过重写的布尔运算符。

    在流对象上的>> 运算符的情况下,该运算符被覆盖以返回流对象,因此类似于:while (cin >> userInput)、cin >> userInput 返回cin,这将产生 true 或假的。

    这是好的做法吗?

    我还是一名大学生,所以需要注意这一点。在流的情况下,我会说这是一种很好的做法,因为这是一种众所周知的做事模式。大多数人可以直接说出您打算做什么,而替代方案则不那么清楚。

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

    【讨论】:

      【解决方案3】:

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

      curr = curr->next 表达式通过引用返回表达式的左侧(请参阅chained assignments)。表达式的左侧是一个指针,可以转换为布尔值。如果指针等于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->next)?如果没有,边缘情况是什么?这是一个好的做法吗?

      如果表达式可转换为bool,则可以这样做,并且在许多情况下,将表达式嵌入循环是“转换为布尔”功能的惯用用法。边缘情况取决于表达式的实现细节。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-25
        • 1970-01-01
        • 1970-01-01
        • 2019-06-20
        • 2017-12-14
        • 2023-03-13
        • 1970-01-01
        相关资源
        最近更新 更多