2016-12-28 50 views
-1

给定链表的头部,当通过链表来计算列表的大小时,常用的方法可能是C++ while()...关于执行一行代码的条件

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) { 
    ... 
} 

我wond ering可以在执行一行代码(e.x.)时始终调用while()。在这个主题中,关于curr = curr-> next的条件)?如果不是,边缘情况是什么?这是一个很好的做法吗?

感谢

+2

'如果'请什么? –

+0

什么'if'?您的帖子不包含一个。 –

+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分配给a,bc

流对象可以直接作为bool进行求值,因为它是通过覆盖的bool操作符的designed to do so

>>运营商针对流对象的情况下,运营商被覆盖在类似返回流对象,所以:while (cin >> userInput)cin >> userInput回报cin,这将产生真或假。

这是一个很好的做法吗?

我仍然是一名大学生,所以需要采取这些盐。在流的情况下,我会说这是一个很好的做法,因为这是一种众所周知的模式。大多数人可以告诉你打算做什么,而替代方案并不明确。

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

0

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

可我总是调理我的,而()上的一行代码(如执行本主题中,条件在curr = curr-> next)?如果不是,边缘情况是什么?

while中的条件可以是任何可以隐式转换为bool的表达式。在你的例子中,“curr = curr->next”评估为一个指针,它符合这个要求。

这是一个很好的做法吗?

不会让您感到困惑的代码是最佳做法。

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 

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

我在想,我可以总是在执行一行代码(本主题中的条件,curr = curr-> next)时执行条件while()。如果不是,边缘情况是什么?这是一个很好的做法吗?

你可以这样做,如果表达式可以转换为bool,而且在许多情况下,嵌入在一个循环中的表达是一个习惯使用的“转换为bool”功能。边缘情况取决于表达式的实现细节。