c言語 if (a != b) と if (a =! b) の違い


表題のようにプログラム中で

[code]

    if(a!=b)
    
[/code]

を

[code]

    if(a=!b)
    
[/code]

と誤って記述した所、コンパイルはできるのですがそこでプログラムが停滞していました。  
コンパイルができるということはこの記述にも意味があるのでしょうか？

どのような意味なのでしょうか？

* * *

追記

[code]

    for(i=0;i<n;i++){
        printf("check1");
        if(a=!b){
            実行コード
        }
    }
    printf("check2");
    
[/code]

とした時に実行中でcheck2が出力されず、プログラムが停滞しました。

[code]

    if(a!=b)
    
[/code]

としたら正常に動作しました。




b の否定結果を a に代入していると思います。  
分けて考えると以下のようになります。

`if( a = (!b) )`

このため、if( a ) という比較式になります。  
つまり、a が 0 以外の場合は常に真として扱います。




b の否定結果を a に代入していると思います。  
分けて考えると以下のようになります。

`if( a = (!b) )`

このため、if( a ) という比較式になります。  
つまり、a が 0 以外の場合は常に真として扱います。

