C 了解a'的退出条件;对于';环
在阅读堆栈溢出问题后,我提出了这个问题 在用户的评论中,他们发布了这个C 了解a'的退出条件;对于';环,c,loops,syntax,for-loop,C,Loops,Syntax,For Loop,在阅读堆栈溢出问题后,我提出了这个问题 在用户的评论中,他们发布了这个for循环,该循环为位位置分配1或0,以便从整数十进制转换为字符*二进制 for(; bits--; u >>= 1) str[bits] = u & 1 ? '1' : '0'; 我理解为什么不需要初始化值。这是我一直知道的for循环的语法: for ( variable initialization; condition; variable update ) 我不明白“比特--”怎么可能是一
for
循环,该循环为位位置分配1或0,以便从整数十进制转换为字符*二进制
for(; bits--; u >>= 1)
str[bits] = u & 1 ? '1' : '0';
我理解为什么不需要初始化值。这是我一直知道的for
循环的语法:
for ( variable initialization; condition; variable update )
我不明白“比特--”怎么可能是一个退出条件。请帮助我理解这段代码是如何工作的(我对它进行了测试,它是有效的)。在C中,值为零在布尔上下文中计算为“false”。因此,当
位--
计算为0
时,在循环上下文中,它计算为“false”,并终止循环
例如,如果你说:
int x = 1;
if (--x)
{
printf("True!\n");
}
else
{
printf("False!\n");
}
它将输出“False”,因为
--x
的计算结果为0,这在布尔上下文中是“False”。所有条件基本上归结为检查某物是否为0。0表示false
,其他所有内容表示true
。因此,当位
为0时,循环将中断
您有时会在写入条件时看到,
或
if (variable) // or while(variable)
那只不过是简写而已
if (variable != 0) // or while (variable != 0)
所以
是的缩写
for (; bits-- != 0; u >>= 1)
bits——是int类型的赋值表达式(因为它将返回b的值,即int)。为了匹配for循环语法,它被转换为布尔表达式,这意味着如果位=0事实上,条件与bits相同=0,但通过使用位-,它同时更改位的值,使代码更紧凑,仅此而已。正如其他人所说,在C中,可以使用整数作为条件-0或false
,任何其他的true
。(事实上,你几乎总是这样做——即使是像aOk这样的表达式,我也怀疑是这样。谢谢你。查尔斯,你是对的,但是--x和--x不一样。如果你把上面的代码改成x--,它会打印“True!”@dfmx123,增量后和增量前之间的差异是另一个问题,实际上不在这里的问题范围内。要点只是为了证明计算结果为零的表达式被视为“错误”在条件上下文中。这就是C程序员被诅咒的原因!!产生的代码做了一些事情,但没有人再理解它了。不要试着这样写代码!!比特--递减比特变量,一旦它为零,它就会返回false@guitarflow那些理解C语言及其习惯用法的人对此类代码的理解非常好,就像这在语言中非常常见一样C代码(包括K&R手册),我想说的是,要理解C代码,就必须学习这个习语。那么,为什么要为那些不懂C代码的人编写新代码(任何语言的代码)?对于精通C语言的读者来说,更“通俗易懂”的形式甚至可能会使事情变得复杂,例如。,“他为什么不使用[常用成语],我还缺少什么吗?”@Arkku我也理解代码,但你必须承认这不是一种好的编码风格。以“标准”的方式编写for循环让任何人都更容易理解,而不仅仅是裂缝。像“u”这样的变量名也不是描述性名称;)@guitarflow我想你的意思是,位--
作为终止条件的风格不好,这一点我不同意(尽管我个人可能会在这里用代替,而用代替).至于u
,不,它不是描述性的,但考虑到代码片段的简单性,它可能不需要…例如,如果这是一个将uint转换为基数为2的字符串的例程,您会称之为u
?类似于num\u to\u convert
的东西会更糟(误导性和模糊性)当然,我们不知道这是否是函数的一部分,u
有着如此明显的作用。@Arkku我可能会称之为numSourceStr或类似的东西。我知道驼峰案例不是K&R风格。我更倾向于“现代”的一面,但我可以接受。事实上,在C中,除了零之外,我认为一切都是正确的。
for (; bits-- != 0; u >>= 1)