在C for循环中执行一个语句和update语句[已关闭]

hujrc8aj  于 2023-03-22  发布在  其他
关注(0)|答案(4)|浏览(158)

已关闭。此问题为opinion-based。当前不接受答案。
**想要改进此问题吗?**请更新此问题,以便editing this post可以用事实和引文来回答。

6天前关闭。
Improve this question
编译后的机器码(汇编)是不同的。第一种编码风格是否至少会稍微提高性能?

for(int i=0;i<N;printf("%d\n",(x + i++)));

代替

for(int i=0;i<N;i++)
  printf("%d\n",(x + i));
jckbn6z7

jckbn6z71#

下面的编码风格在资源方面有什么好处吗?

for(int i=0;i<N;printf("%d\n",(x + i++)));

代替

for(int i=0;i<N;i++)
  printf("%d\n",(x + i));

目前还不清楚你可能指的“资源”到底是什么,但是

  • 没有理由认为一个比另一个使用更少的内存
  • 没有理由认为一个会比另一个需要更多的CPU。

事实上,一个给定的编译器会把这两个编译成相同的机器码是合理的(尽管这并不确定)。例如,你可以通过Godbolt验证在优化级别-O2,Gcc 12.2实际上 * 确实 * 为循环中的两个变体生成了相同的汇编代码。
前一个源代码稍微小一些,但节省的空间对于现代存储系统来说并不重要,而且较小源代码的代价是它比已经很难阅读和理解的第二个版本更难。
这是我可能会写同样的代码:

for (int i = 0; i < N; i++) {
    printf("%d\n", (x + i));
}

请注意额外的空格,这使得更容易挑选出语法上不同的组件,与第一个示例相比相对简单的表达式,以及在for循环体周围使用的花括号({}),即使它只包含一个语句。
当然,风格偏好会有所不同,但无论你选择什么风格,都应该迎合这样一个事实,即大多数代码被阅读的次数比编写/修改的次数要多得多。

uxhixvfz

uxhixvfz2#

for(;;)语句中final子句的用途是在循环结束时执行(通常是数学)运算,例如递增/递减循环索引。
它不是用来执行像printf()这样的操作的。把你的常规操作放在循环体中--这是开发人员期望找到它们的地方--并在for(;;)的final子句中递增索引。你不会损失任何效率。

可维护的代码遵循传统的编码语言,除非有真实的的、紧迫的原因。“因为我可以”并不意味着“因为我应该”!

ecr0jaav

ecr0jaav3#

将表达式放在for语句的第三部分而不是作为循环体中的语句表达式的主要原因是循环中的continue;语句将跳过循环体中的其他语句,但不会跳过for循环中的表达式。例如,在:

for (i = 0, j = 0; i < N; ++i)
{
    if (SomeTest(i))
        continue;
    ++j;
}

continue;将跳过++j,但不会跳过++i。因此,i将对所有迭代进行计数,而j仅对未执行continue;的迭代进行计数。
没有continue;,代码中没有语义差异;循环体末尾的语句表达式与for语句的第三部分中的表达式一样执行,这使得只有人类的考虑作为在它们之间进行选择的理由,特别是它们对人类读者的表达能力。

iaqfqrcu

iaqfqrcu4#

对于阅读代码的人来说,与for循环条件内的printf语句的第一样式没有显著差异可以被认为可读性较低并且更难以理解。

相关问题