在C中用分号分隔的两个初始值

在C中用分号分隔的两个初始值,c,for-loop,while-loop,conditional-statements,C,For Loop,While Loop,Conditional Statements,我不明白这是怎么可能的,所以我试着用代码进行实验 output: -1 有人能解释一下上述两种代码是如何工作的吗 当(i=-1)计算为真时,该如何计算?该条件始终为真。因为赋值语句的值就是赋值。因此,-1是非零值,在中,非零值被视为true,因此它始终为true 正确的用法应该是=,它比较值并根据相等或不相等返回1或0 因此,当您执行i=-1并将放入while循环条件时,它归结为 output: condition is true -1 由于-1在中被视为true,因为它不是

我不明白这是怎么可能的,所以我试着用代码进行实验

output: -1
有人能解释一下上述两种代码是如何工作的吗
当(i=-1)计算为真时,该如何计算?

该条件始终为真。因为赋值语句的值就是赋值。因此,
-1
是非零值,在中,非零值被视为true,因此它始终为true

正确的用法应该是
=
,它比较值并根据相等或不相等返回
1
0

因此,当您执行
i=-1
并将
放入while
循环条件时,它归结为

output: condition is true
        -1
由于
-1
在中被视为true,因为它不是零-循环条件的计算结果为true


此处给出了
break
语句,以便此循环不会变成无限循环。

首先,对于循环一,什么都不做,如果启用优化,将从生成的代码中删除

第二个一次进入循环。实际循环将由优化编译器删除,并由puts、初始化和printf调用替换


仅带格式字符串的printf被puts替换

C中循环的
语法为

while( -1 ){
  ...
   /* break here */
}
现在,按照惯例,
expr1
是循环初始化,
expr2
是继续运行的条件,
expr3
是循环之间的增量。但这只是一种惯例——实际上,编译器只是安排执行
expr1
一次,然后
expr2
决定是否再次遍历循环,然后在循环底部执行
expr3
。所以它或多或少相当于

for(expr1, expr2; expr3)
    /* body of loop */
或者,换句话说:

expr1;
while(expr2) {
    /* body of loop */
    expr3;
}
但另一个关键点是,是的,表达式

expr1;
while(1) {
    if(!expr2) break;
    /* body of loop */
    expr3;
}
看起来不太像一种状况;这看起来像是一项任务。但在C语言中,当你使用一个表达式作为条件时(也就是说,在我们关心的是表达式是“假”还是“真”的上下文中),我们真正关心的是表达式的计算结果是零还是非零。赋值表达式的值只是被赋值的值。所以

i = -1
是-1,这不是零,所以它被解释为“真”。所以如果你说

i = -1

该条件始终为“true”,因此它将是一个无限循环,除非正文中某处有
break
语句(或
return
,或调用
exit()
,或类似的内容).

你知道使用
=
赋值和使用
=
比较等式之间的区别吗?你也知道在C语言中,所有非零的东西都是真的,只有零是假的?以及
break
语句的作用是什么?如果有什么你不知道的,那就找一本好的入门书,从开始。是的,我知道区别,但这是问的问题,但是当条件中给出i=-1时,赋值给“i”然后计算为真吗?条件是
i=-1
。这将被完全计算,赋值的结果是赋值后的左侧,即
的值de>i`在赋值之后,它是
-1
,如果不是零,则为真。应显示警告issued@Someprogrammerdude感谢您花时间解释,谢谢。for循环将-1分配给
I
。这不是什么。虽然不多,但也不是什么。OP想知道代码的作用。因此e对优化的解释是不相关的(并且有些混乱)。优化不应该影响代码的功能,只影响它的速度。@JonathanLeffler
i
如果启用优化,也将被清除。好的,由于循环条件中的赋值,打印的值将是
-1
。因此,结果中还保留有循环的痕迹。循环不会被忽略-它是影响生成的输出。
i = -1
i = -1
while(i = -1) {
    /* body of loop */
}