理解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 )。