"for"语句是如何构造的?
How is the "for" statement constructed?
大家都知道for最常用的用法:(0 - 9)
for (int i = 0; i < 10; i++)
然而,我也见过一些不太常见的版本,比如(1 - 10)
for (int i = 0; i++ < 10;)
or (1 - 10)
int i = 0;
for (;i++ < 10;)
这表明循环可能比我想象的更可定制。如果我猜对了,似乎
- 总是需要两个分号来分隔3个可选语句
- 第二条语句需要转换为布尔值1,以便循环继续
- 第一个语句是唯一一个我可以声明变量的语句,并且被调用一次
- 第三条和第二条语句在每次迭代后调用,可以包含任何内容(除了声明)
- 只要满足这些条件,我可以做任何
for instance (0, 3, 7)
for (int i = 0, j = 2; i < 10; i+=++j)
这些类型的for循环被认为是语言的标准用法吗?或者仅仅是由于msvc++的实现设计而发生的事情?有关于for循环规则的官方说明吗?
你是正确的。然而…
仅仅因为有可能并不意味着你应该去做。"for"循环的全部目的是将其组织在任何有能力的程序员都能快速理解的级别上。一个关键的基础是程序员应该知道"for"循环将运行多长时间。如果你给所教授的内容添加更多的复杂性,那么for循环的意义就会丢失。我不能轻易看你的第三个例子,并告诉你循环将迭代多长时间。
如果你需要像第三个例子那样使用"for"循环,你最好写一个while/do-while循环。
来自ISO C99草案:
for ( clause-1 ; expression-2 ; expression-3 )
语句的行为为:表达式expression-2为控制表达式在每次执行循环体之前求值。
表达式expression-3在每个表达式之后作为空表达式求值循环体的执行。
如果子句1是声明,则它声明的任何标识符都是声明和的剩余部分整个循环,包括另外两个表达式;它是在在控制的第一次评估之前的执行顺序表达式。
如果子句-1是表达式,则将其计算为void表达式前的第一次评估控制表达式。
clause-1和expression-3都可以省略。一个省略的expression-2被一个非零常数代替。
:
-
总是需要两个分号来分隔3个可选语句
是的。
-
第二条语句需要转换为布尔值1才能继续循环。
是的。第二个语句将计算为布尔值true/false(尽管不一定是"1")。
-
第一个语句是唯一一个我可以声明变量的语句,并且被调用一次
对于c++,可以。在C语言中(在C99之前),必须在for循环之外声明变量。
-
第三条和第二条语句在每次迭代后调用,可以包含任何内容(除了声明)
是的。它们可能什么也不包含。例如,
for ( ;; )
表示"永远循环"。只要满足这些条件,我可以做任何
这是一个很好的教程:
- http://www.cplusplus.com/doc/tutorial/control/
我个人最喜欢的方法之一是遍历链表:
for(Node *p = head; p; p = p->next) ...
当然,如果你执行"no condition",你会得到一个无限循环:
for(;;) ...
但是是的,只要你有for(
后面跟着有效的语句,两个分号和)
,它就是"好代码"。
for(printf("h"); !printf("worldn"); printf("ello, "));
是有效的,如果相当奇怪的C代码(和c++,但首选cout
)。
当然,"它编译并做你所期望的"并不意味着它是正确的或很好地使用了语言。如果其他人可以阅读代码并理解它的含义,并且不想去其他地方工作或对最初编写代码的人实施暴力,则通常更可取。
这取决于你想怎么做。c++是灵活的,允许您按照自己的意愿构建语句。当然,更清晰的方式更可取。
for语句由";"字符分隔的三部分组成:
1)初始化代码(int I = 0):其中初始化将在循环中使用的计数器变量;
2) condition for loop (i <20):循环继续进行的测试条件;
3) step (increment):您可以选择为计数器变量指定一个增量;
当你知道你要迭代多少次(循环)时,"for"语句是更可取的和指示性的使用。否则,建议使用"while"。
c++灵活性示例:
for(int i = 0; i < 20; i++) { }
等价于
int i = 0;
for(;i < 20;) { i++; }
- "error: no matching function for call to"构造函数错误
- 表示"accepting anything for this template argument" C++概念的通配符
- 如何在C++中从两个单独的for循环中添加两个数组
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- Python中的for循环与C++有何不同
- 如果子类中没有构造函数方法,则错误"no matching function for call to 'LGame::LGame(String&)'"
- c++ 中的 range-for 会调用项的复制构造函数吗?
- 双重列表复制构造函数:与单一列表复制构造函数有何不同
- 意外错误"no matching function for call to",需要没有参数的构造函数
- 构造函数/解构函数情况下的'undefined reference to vtable for'
- for 循环中的构造函数
- 如何在 for 循环中调用参数化构造函数
- 基于范围的循环与 for-each 循环有何不同
- 构造非初始化结构时的"error: no matching function for call to"
- C++ Boost::序列化"no matching function for call"到我的加载函数参数中类的构造函数
- for 循环构造从 C++ 程序开始
- 缺少复制构造函数与对象切片有何关系
- "for"语句是如何构造的?
- "for"循环中使用的复制构造函数,但在哪里?
- 在 for 构造中对第二个表达式使用 size() 总是不好的