【发布时间】: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 风格的。我在这里更倾向于“现代”,但我可以忍受。