在阅读此帖子Print an int in binary representation using C
后,我有了这个问题在用户评论中,他们发布了这个for循环,它为位位置分配1或0,以便从int decimal转换为char * binary。
for(; bits--; u >>= 1)
str[bits] = u & 1 ? '1' : '0';
我理解为什么不需要初始值。这是我一直都知道的for循环的语法:
for ( variable initialization; condition; variable update )
我不明白的是'bit--'如何成为退出条件。请帮助我理解这段代码是如何工作的(我测试了它,它是有效的)。
谢谢。
答案 0 :(得分:9)
在C中,零值在布尔上下文中计算为“false”。因此,当bits--
求值为0
时,在循环的上下文中,它计算为“false”并终止循环。
如果您说,例如:
int x = 1;
if (--x)
{
printf("True!\n");
}
else
{
printf("False!\n");
}
它将输出“False”,因为--x
的计算结果为0,在布尔上下文中为“false”。
答案 1 :(得分:1)
所有条件基本上归结为检查某事物是否为0。 0表示false
,其他一切表示true
。因此当bits
为0时,该循环将会中断。
您有时会看到while
或if
条件
if (variable) // or while(variable)
这只是
的简写if (variable != 0) // or while (variable != 0)
所以
for (; bits--; u >>= 1)
是
的缩写for (; bits-- != 0; u >>= 1)
答案 2 :(得分:0)
bits--是int类型的赋值表达式(因为它将返回b的值,即int)。为了匹配for循环语法,它被转换为布尔表达式,这意味着如果bits!= 0则为真。事实上,条件与bits!= 0相同,但是通过使用bits--,它会改变值同时使用位,使代码更紧凑,就是这样。
答案 3 :(得分:0)
正如其他人所说,在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(因为条件已经检查),并且在最后,位将循环数组的好方法(因为在c中,bits
变量数组已从0
索引到bits-1
)。