【问题标题】:Understanding the exit condition of a 'for' loop了解“for”循环的退出条件
【发布时间】:2012-03-01 12:28:20
【问题描述】:

我在阅读 Stack Overflow 问题后提出了这个问题Print an int in binary representation using C

在用户的评论中,他们发布了这个for 循环,该循环将 1 或 0 分配给位位置,以便从 int 十进制转换为 char * 二进制。

for(; bits--; u >>= 1)
    str[bits] = u & 1 ? '1' : '0';

我明白为什么不需要初始化值。这是我一直都知道的for 循环的语法:

for ( variable initialization; condition; variable update )

我不明白“位--”如何成为退出条件。请帮我理解这段代码是如何工作的(我测试过,它是有效的)。

【问题讨论】:

  • 这就是 C 程序员被诅咒的原因!!生成做某事但没有人再理解它的代码。不要试图写那样的代码!! bits--递减bits变量,一旦为零,返回false
  • @guitarflow 懂C及其习语的人都懂这样的代码,因为这在C代码中很常见(包括K&R书),我想说必须学会这个习语才能理解C代码一般来说。那么,为什么要为那些理解该语言的人编写新代码(用任何语言)?对于精通该语言的读者来说,更“通俗易懂”的形式甚至可能使事情复杂化,即“他为什么不使用 [常用成语],是不是我遗漏了什么?”
  • @Arkku 我也理解代码,但你必须同意这不是好的编码风格。以“标准”方式编写 for 循环可以使其对任何人都更具可读性,而不仅仅是裂缝。像“u”这样的变量名称也不是描述性名称;)
  • @guitarflow 我假设你的意思是bits-- 作为终止条件的风格不好,我不同意(尽管我个人可能会在这里用while 代替for) .至于u,不,它不是描述性的,但考虑到代码片段的简单性,它可​​能不需要......例如,如果这是将uint转换为base 2中的字符串的例程,你会怎么做而是打电话给u?像num_to_convert 这样的东西会更糟(误导和模棱两可)。当然,我们不知道这是否是 u 具有如此明显作用的函数的一部分。
  • @Arkku 我可能会称它为 numSourceStr 或类似的名称。我知道骆驼案不是 K&R 风格的。我在这里更倾向于“现代”,但我可以忍受。

标签: c loops syntax for-loop


【解决方案1】:

在 C 语言中,零值在布尔上下文中计算为“假”。所以当bits-- 计算为0 时,在循环的上下文中它计算为“false”并终止循环。

如果你说,例如:

int x = 1;
if (--x)
{
  printf("True!\n");
}
else
{
  printf("False!\n");
}

它将输出“False”,因为--x 的计算结果为 0,在布尔上下文中为“false”。

【讨论】:

  • 好吧,我怀疑是这样的。谢谢。
  • Charles,你是对的,但是 --x 和 x-- 不一样。如果将上面的代码更改为 x--,它将打印“True!”。
  • @dfmx123,后增量和前增量之间的区别是另一个问题,并不真正属于这里的问题范围。重点只是为了证明在条件上下文中计算为零的表达式被视为“假”。
【解决方案2】:

所有条件基本上都归结为检查某物是否为 0。 0 表示false,其他所有表示true。因此,当bits 为 0 时,该循环将中断。

您有时会看到 whileif 条件写入

if (variable) // or while(variable)

这只是简写

if (variable != 0) // or while (variable != 0)

所以

for (; bits--; u >>= 1) 

简称

for (; bits-- != 0; u >>= 1)

【讨论】:

  • 实际上,在 C 语言中,除了我认为的零之外,一切都被认为是正确的。
【解决方案3】:

bits-- 是 int 类型的赋值表达式(因为它会返回 b 的值,即 int)。为了匹配 for 循环语法,它被转换为布尔表达式,这意味着如果 bits != 0 则为真。

其实这个条件和bits!=0是一样的,但是通过使用bits--,它同时改变了bits的值,使得代码更加紧凑。就是这样。

【讨论】:

    【解决方案4】:

    正如其他人所说,在 C 中,您可以使用整数作为条件 - 0 或 false,以及 true 的任何其他值。 (实际上,您几乎总是这样做——即使像 a<b 这样的表达式也是一个 int。)

    因此,当bits-- 为 0 时,循环将结束。

    -- 运算符出现在变量之后时,它会减少变量,并获取它的前一个值。例如,如果您有int a=3,b; b=a--;,则 b 为 3,a 为 2。

    因此,在位从0 减少到-1 之后,循环将退出。

    这意味着,如果在开始时,bits==8(例如),循环将迭代 8 次,在第一次时,位将是 7(因为条件已经检查),在最后,位将为 0。这是一种遍历数组的好方法(因为在 C 中,bits 变量数组的索引从0bits-1)。

    【讨论】:

      猜你喜欢
      • 2018-03-11
      • 2021-06-07
      • 2015-10-18
      • 2021-08-22
      • 1970-01-01
      • 2011-01-22
      • 2021-10-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多