" for"的多个陈述循环无块

时间:2017-09-13 06:26:05

标签: c for-loop

以下代码片段在接受采访时被告知我,是否有可能在没有阻止的情况下评估for循环的所有语句?

int i, n, t1 = 0, t2 = 1, nextTerm;

for(int i= 0; i < 10; i++)
{
    printf("%d ", t1);
    nextTerm = t1 + t2;
    t1 = t2;
    t2 = nextTerm;
}

我问他,我认为不可能在没有阻塞的情况下评估for循环的多个语句。但是,我的朋友告诉我,可以使用逗号运算符,如下所示:

int i, n, t1 = 0, t2 = 1, nextTerm;

for(int i= 0; i < 10; i++)
    printf("%d ", t1),
    nextTerm = t1 + t2,
    t1 = t2,
    t2 = nextTerm;

我知道comma运算符如何处理单行语句。但我想知道如何为多行工作comma运算符?

此外,还有其他办法可以完成这项任务吗?

3 个答案:

答案 0 :(得分:6)

注意,不要像上面那样编写代码或者像我要做的那样!

你有一个关于多行的答案,但关于另一种写这种方式的另一个问题是:

for(int i= 0; i < 10; nextTerm = t1 + t2,
                      t1 = t2,
                      t2 = nextTerm,
                      i++)
    printf("%d ", t1);

甚至,走到极端......

for(int i= 0; i < 10; printf("%d ", t1),
                      nextTerm = t1 + t2,
                      t1 = t2,
                      t2 = nextTerm,
                      i++)
    /* Hey, empty loop! */;

答案 1 :(得分:5)

这个单行语句,格式化为多行。

使用这样的逗号运算符完全是胡说八道。删除块完全没有任何目的 - 它只会使你的代码更危险,更难阅读,因为绝对没有任何好处。使用分号。

始终在循环后使用复合语句。 甚至如果循环中只有一个单一的语句 - 历史上最昂贵的错误之一,“苹果公司的故事”是由于使用大括号而引起的。

答案 2 :(得分:3)

有多少行并不重要。重要的是是否有单一陈述。并且语句由分号(;)分隔。

词法上,C代码忽略了分隔令牌所不需要的空格。所以这个多行声明:

printf("%d ", t1),
nextTerm = t1 + t2,
t1 = t2,
t2 = nextTerm;

就像它写在一行一样:

printf("%d ", t1), nextTerm = t1 + t2, t1 = t2, t2 = nextTerm;

虽然这可能感觉很聪明,但不要写这样的代码。这是混淆的练习。