5861


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

[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]

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


CC BY-SA 3.0
2015-02-03T10:16:45.157
5859
2015-02-05T01:20:55.033
2015-02-05T01:20:55.033
2155
2155
question
c
c言語 if (a != b) と if (a =! b) の違い


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

`if( a = (!b) )`

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


CC BY-SA 3.0
2015-02-03T10:19:04.877
5861
2015-02-03T10:30:17.990
2015-02-03T10:30:17.990
7926
7926
5859
answer

[code]

    if(a!=b) -> if (a != b)  // A
    if(a=!b) -> if (a = !b)  // B
    
[/code]

上記Aのコードはaとbが違うならTRUE同じならFALSEで条件分岐するという意味です。  
Bのコードはaにbの否定(もしbがTRUEならFALSE、FALSEならTRUE)を代入し、aの値を評価してTRUEかFALSEで条件分岐するという意味です。


CC BY-SA 3.0
2015-02-03T10:25:50.517
5864
2015-02-03T10:25:50.517
7364
5859
answer


正しい正解が出ているので今更ですが、昔同僚が書いたコードをレビューしていてお茶をフイた良く似たコードを抜粋。

[code]

    #include <stdio.h>
    
    int
    main(int argc, char* argv[]) {
      int a = 2, b = 1, c = 0;
    
      // a, b, c すべて同じなら
      if (a == b == c) {
        puts("正解");
      }
      return 0;
    }
    
[/code]

人間としては許してあげたいコードですが...  
この質問と同様にコンパイラはこれをエラーとせずにコンパイルしてしまいます。  
しかも「正解」のケースに入ります。

  1. `a == b` は偽(つまり0)
  2. `偽(0) == c` は正

よって「正解」が表示されます。


CC BY-SA 3.0
2015-02-04T04:15:27.223
5915
2015-02-04T04:15:27.223
440
5859
answer