Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 了解a'的退出条件;对于';环_C_Loops_Syntax_For Loop - Fatal编程技术网

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)