考虑以下代码,
int i;
while(i=0)
printf("Hello");
现在一般来说,i = 0是assignment
而不是condition
来检查while
。
但GCC
编译器会发出警告,甚至会正确评估它(不执行print语句)。
为什么呢?我通常会用括号来表示真值,但是我的后辈觉得我错了,这里的括号没有真正的理由!
编辑:对“实际”疑问进行归零,请考虑以下测试用例
int callme(){
return 0;
}
int main(int argc,char*argv[]){
int c;
while(c = callme()){
printf("Calling...\n");
}
return 0;
}
答案 0 :(得分:8)
表达式i = 0
有两件事:
i
我通常会用括号表示真值,但是我的小辈 觉得我错了,没有正确的理由括号 在这
这通常是对编译器的暗示“我实际上想要这个,我没有忘记=
,闭嘴”。
对于您的具体情况,没有理由写if (i = 0)
:您已经知道if(0)的作用。但是当用作:
if ((i = some_function()))
...
答案 1 :(得分:2)
i=0
始终是一个赋值(除非您将它作为int i = 0;
的一部分进行初始化)。但是任何非void表达式都可能出现在while
循环的条件内,如果它的计算结果为非零,则循环体将被执行,如果它为零,则循环体不会被执行。
符号:
while (i = 0)
printf("Hello\n");
总是等同于:
i = 0;
根本没有理由编写循环。
人们会写其他表达式:
while (c = getchar())
...process EOF or a non-null character...
但那通常是一个错误。你更有可能写作:
while ((c = getchar()) != EOF)
...process a character - possibly null...
甚至:
while ((c = getchar()) != EOF && c != '\0')
...process a non-null character...
第一个getchar()
循环收到GCC的警告;后两者不是因为对作业的价值的明确测试。
写这样一个条件的人:
while ((c = getchar()))
真的很烦我它避免了GCC的警告,但它不是(IMNSHO)编码的好方法。
答案 2 :(得分:2)
使用
等赋值运算符时a=0;
您将值指定为“a”,仍然返回数字0.
为了测试您的问题,我尝试了以下几行代码:
int a;
printf("%d", a=0);
这些行显示为0.
然后,我测试了另一组代码:
int b;
printf("%d", b=15);
这里显示15行。
所以,如果你这样做:
while(a=0)
{
printf("zero");
}
(a = 0)语句将返回false,因此不显示任何内容。
但如果您这样做:
while(a=15)
{
printf("fifteen");
}
“十五”将无休止地显示,因为语句(a = 15)将返回非零值,或15,这不是假,不是零,因此它是真的。 :)
答案 3 :(得分:1)
正如cnicutar上面所说的那样,赋值也会产生零值。
其他一些信息:
人们省略额外的'='是一种常见的编码错误,因此比较成为一项任务。
避免这种情况的一种简单方法是编写如下的比较,在这种情况下,即使错过'=',编译器也会出错
while(0 == i)
{
prinf("Hello");
}