在 for 中插入一个 while 循环。认为这是一个脑筋急转弯[关闭]
Posted
技术标签:
【中文标题】在 for 中插入一个 while 循环。认为这是一个脑筋急转弯[关闭]【英文标题】:Inserting a while loop inside a for. Consider this a brain teaser [closed] 【发布时间】:2013-12-15 12:45:09 【问题描述】:我最近从我的一些朋友那里听说他设法在 for 中插入了一个 while 循环。我所说的“内部”是指字面意义上的内部。我在 C/C++ 中尝试过。像这样的:
for( exp1; while(); exp2)
exp3;
或
for(exp1; exp2; while())
exp3;
两种方法我都试过了,但我似乎没能成功。有没有其他人试过这个?有人可以给我一个有效的例子吗?
【问题讨论】:
我认为你的朋友在撒谎,或者你只是听错了他/她。he managed to insert a while loop inside a for
为什么不问问自己怎么做?
我无法引用标准的确切片段,但我认为敌人需要表达式,并且控制结构(如while
)将不起作用。但最重要的是,我会问 - 你需要它做什么?
不明白为什么这么多反对票,这是一个完全合理的问题。
@danp:我没有投反对票,但我想他们是因为这个问题本质上是“我听说过一个关于这个不切实际的事情的轶事。我该怎么做?”。加上语言标签垃圾邮件。
【参考方案1】:
这两个程序在 C 中无效。
for
C 中的循环子句必须是表达式(或第一个子句的声明)。不允许使用语句,例如 while
语句。
【讨论】:
【参考方案2】:for( int a = 17; 1 != [&]()while(!(a%2))a/=2;;return a;(); a=a*3+1)
std::cout <<a<<"\n";
是while
内的for
。
【讨论】:
这是 Collatz 的 C++11 实现吗? @iwillnotexistidonotexist 是的。然而,它只打印出奇怪的步骤。我一直在寻找一种不平凡的方式来使用while
,自然想回答两个人说做不到的问题。
我以前从未在野外见过 C++11 lambda 表达式,这是一个很好的例子。 +1。但我偷偷怀疑 OP 看到了一个带有 while
的 GCC 语句表达式。 for
中的语句表达式类似于for(a = 17; (while((a%2) & 1 == 0)a/=2; a;) != 1 ; a=3*a+1);
。注意 ( /*expr*/ )
语法的特征。【参考方案3】:
一般形式的for语句(不包括基于范围的for)实际上由三个表达式组成:init表达式、条件表达式和另外一个表达式。 while 语句不是表达式语句,因此不能在表达式中使用。
【讨论】:
【参考方案4】:我同意其他人的观点,即您不能将这样的 while
语句插入到 C 中的 for
循环中。据我所知,for
循环的语法是这样的:
for(initializer; condition; increment)
...
教科书上说只能接受从句和表达式。
while
语句创建一个结构化循环,只要在每次迭代开始时while
中指定的条件为真,该循环就会执行。所以,我认为while
条件是针对while
语句本身,而不是针对for
循环。干杯。
【讨论】:
以上是关于在 for 中插入一个 while 循环。认为这是一个脑筋急转弯[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
在实现无限循环时,使用 while(1) 与 for(;;) 与 goto (在 C 中)有区别吗?
C;如果我在 while 循环内的 for 循环中放置一个 break