作业是一种条件

nim*_*ish 2 c visual-c++

考虑以下代码,

int i;
while(i=0)
    printf("Hello");
Run Code Online (Sandbox Code Playgroud)

现在,一般而言,我= 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;    
}
Run Code Online (Sandbox Code Playgroud)

cni*_*tar 9

表达式i = 0做了两件事:

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

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

这通常是对编译器意味着"我真的想要这个,我没有忘记一个=,闭嘴" 的暗示.


对于你的具体情况,没有理由写if (i = 0):你已经知道if(0)是做什么的.但它用作以下内容时非常有用:

if ((i = some_function()))
    ...
Run Code Online (Sandbox Code Playgroud)