理解for循环的退出条件
读完这个post后我有了这个问题用C语言打印二进制表示forms的int
在用户注释中,他们发布了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–‘如何成为退出条件。 请帮助我理解这段代码是如何工作的(我测试了它,它是有效的)。
谢谢。
在C中,零值在布尔上下文中计算为“false”。 因此,当bits--
计算为0
,在循环的上下文中,它计算为“false”并终止循环。
如果你说,例如:
int x = 1; if (--x) { printf("True!\n"); } else { printf("False!\n"); }
它将输出“False”,因为--x
计算结果为0,在布尔上下文中为“false”。
所有条件基本上归结为检查是否为0。 0表示false
,其他一切表示true
。 因此,当bits
为0时,循环将中断。
您有时会看到写入条件的while
或条件
if (variable) // or while(variable)
这只是简写
if (variable != 0) // or while (variable != 0)
所以
for (; bits--; u >>= 1)
是的缩写
for (; bits-- != 0; u >>= 1)
bits–是int类型的赋值表达式(因为它将返回b的值,即int)。 为了匹配for循环语法,它被转换为布尔表达式,这意味着如果bits!= 0则为真。实际上,条件与bits!= 0相同,但是通过使用bits–,它会更改值同时使用位,使代码更紧凑,就是这样。
正如其他人所说,在C中,你可以使用整数作为条件 – 0或false
,其他任何东西true
。 (实际上,你几乎总是这样做 – 甚至像a是一个int这样的表达式)
因此,当bits--
为0时,循环结束。
当--
运算符在变量之后,它会减少变量,并获得它的先前值。 例如,如果你有int a=3,b; b=a--;
int a=3,b; b=a--;
,那么b将是3,a将是2。
因此,循环将在该位从0
减少到-1
之后退出。 这意味着,如果在开头, bits==8
(例如),循环将迭代8次,当在第一个时,比特将是7(因为条件已经检查),并且在最后,比特将是0.循环数组的好方法(因为在c中, bits
变量数组的索引从0
bits-1
)。