C ++ while()...执行一行代码的条件

时间:2016-12-28 23:48:42

标签: c++

鉴于链表的头部,当浏览链表来计算列表的大小时,常用的方法可能是

import matplotlib.pylab as plt
import numpy as np
max_tweets = 19
p = 20
n = 30

datas = [{'label':'tweets', 'color': 'r', 'height': max_tweets},
    {'label':'positivity', 'color': 'g', 'height': p},
    {'label':'nagitivity', 'color': 'b', 'height': n}]

i = 0
for data in datas:
    plt.bar(i, data['height'],align='center',color=data['color'])
    i += 1

labels = [data['label'] for data in datas]
pos = [i for i in range(len(datas)) ]
plt.xticks(pos, labels)
plt.xlabel('People Behaviour and Emotions')
plt.title('Sentiment Analysis')
plt.show()

但我也看到人们这样做:

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

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

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

我想知道我是否可以在执行一行代码时调整我的while()(本主题中的e.x.,curr = curr->下一个条件)?如果没有,边缘情况是什么?这是一个很好的做法吗?

由于

3 个答案:

答案 0 :(得分: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}分配给abc

可以直接将流对象评估为bool,因为它是designed to do so通过重写的bool运算符。

如果流对象上有>>运算符,则会重写该运算符以返回流对象,因此类似于:while (cin >> userInput)cin >> userInput返回cin },这将产生真或假。

  

这是好习惯吗?

我还是一名大学生,因此需要采取一些盐。就流而言,我说这是一种很好的做法,因为这是一种众所周知的做事方式。大多数人可以直接告诉你打算做什么,而替代方案并不清楚。

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

答案 1 :(得分:1)

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

curr = curr->next表达式通过引用返回表达式的左侧(参见chained assignments)。并且表达式的左侧是一个指针,可以转换为布尔值。如果指针等于nullptr,则转换后的布尔值将为false,否则为true。

表达式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

使用cin方法将operator bool()对象转换为布尔表达式。布尔表达式中的某些内容(如if()语句或while())会转换为布尔值。

  

我想知道我是否可以在执行一行代码时调整我的while()(本主题中的e.x.,curr = curr-&gt;下一个条件)?如果没有,边缘情况是什么?这是一个很好的做法吗?

如果表达式可以转换为bool,则可以这样做,并且在很多情况下,将表达式嵌入循环中是对&#34;转换为bool&#34;的习惯用法。特征。边缘情况取决于表达式的实现细节。

答案 2 :(得分:0)

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

  

我是否可以在执行一行代码时调整我的while()(本主题中的e.x.,curr = curr-&gt;下一个条件)?如果没有,边缘情况是什么?

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

  

这是一个好习惯吗?

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