作业是一种条件

时间:2012-05-30 04:32:36

标签: c visual-c++

考虑以下代码,

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;    
}

4 个答案:

答案 0 :(得分:8)

表达式i = 0有两件事:

  • i
  • 中存储o的副作用
  • 产生值0
  

我通常会用括号表示真值,但是我的小辈   觉得我错了,没有正确的理由括号   在这

这通常是对编译器的暗示“我实际上想要这个,我没有忘记=,闭嘴”。


对于您的具体情况,没有理由写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");
}