虽然声明被认为是有害的?
最近,我一直在编辑一个结构良好且易于理解的程序,该程序由 C 程序员编写,他习惯性地使用以下习语迭代链表:
int print_shopping_list(listitem_t *list; int max_price) {
int found_count = 0;
listitem_t *item = 列表;
而(项目!= NULL){
if (item->price <= max_price) {
printf("以 %d 便士的价格购买 %s", item->name, item->price);
发现计数++;
}
项目=项目->下一个;
}
返回找到的计数;
}
从表面上看,这并没有错。但是,考虑一下如果另一个程序员(对坚果过敏)调整程序以拒绝花生会发生什么:
int print_shopping_list(listitem_t *list; int max_price) {
int found_count = 0;
listitem_t *item = 列表;
而(项目!= NULL){
**if (item- >type == ITEMTYPE_PEANUTS) {
继续; /* 因为过敏所以不吃花生*/
}**
if (item->price <= max_price) {
printf("以 %d 便士的价格购买 %s", item->name, item->price);
发现计数++;
}
项目=项目->下一个;
}
返回找到的计数;
}
哦亲爱的!现在,修改后的程序如果在购物清单中遇到花生,将永远不会终止,因为 继续
跳转到下一个循环迭代而不为当前项指针分配新值。
如果最初的程序员使用了 为了
声明而不是 尽管
:
int print_shopping_list(listitem_t *list; int max_price) {
int found_count = 0;
**for (listitem_t *item = list;
项目!= NULL;
项目=项目->下一个){**
if (item->type == ITEMTYPE_PEANUTS) {
继续; /* 因为过敏所以不吃花生*/
}
if (item->price <= max_price) {
printf("以 %d 便士的价格购买 %s", item->name, item->price);
发现计数++;
}
}
返回找到的计数;
}
上面的代码有效,因为 a 的第三个表达式 为了
语句(前进到下一次迭代)在 a 之后执行 继续
陈述。
以下形式的任何循环:
对于(a;b;c){
d;
}
可以重写为多个语句:
一个;
而(b){
d;
C;
}
大多数现代编程语言都提供 继续
, 为了
和 尽管
陈述。在我看来 尽管
语句永远不应该用于需要单独的表达式来测试终止并前进到下一次迭代的循环。
在一个 尽管
循环中,如果下一个迭代表达式位于循环体末尾的单独语句中(可能相距很多行),则它很容易被忽略或不执行。
使用 为了
代替 尽管
使程序更简洁、更健壮且更易于阅读,因为与循环相关的所有表达式都在同一行(或几行连续)。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明
本文链接:https://www.qanswer.top/18382/02570608
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/287876.html