93526


### 質問概要

無限ループの中で条件分岐を行って `break` する処理を書いています。  
この時、`if (x != 0)` だと動作するが、`if (x = 0)` とした場合はうまく動作しません。  
それぞれの動作の違いを教えていただきたいです。詳細は後述します。

### 実装したい処理

  1. `scanf` で整数を入力させ、これまで入力された整数の総和を表示する。  
(状態保持用の変数に初期値1を入れているので、最初は1 + (入力された整数)から始まる)

  2. `scanf` で0が入力された場合は無限ループを `break` し、プログラムを終了する。

### 質問詳細

下記コードは想定した動作をしますが、`if (x = 0)` に書き換えると上手く動作しません。

**コード全文:**

[code]

    #include <stdio.h>
    
    int m = 1; //状態保持用変数
    
    int sum(int n) {
        m += n;
        return m; 
    }
    
    int main(void) {
        int x; //入力値受け取り用変数
    
        while (1) {
            printf("n? ");
            scanf("%d", &x);
            if (x != 0) {
                printf("%d\n", sum(x));
            } else {
                break;
            }
        }
    
        return 0;
    }
    
    
[/code]

**出力結果:**

[code]

    n? 4
    5
    n? 5
    10
    n? 0
    ubuntu@dev01: ~$
    
[/code]

**if(x = 0)に書き換え:**

[code]

            if (x = 0) {
                break;
            } else {
                printf("%d\n", sum(x));
            }
    
[/code]

**if (x = 0)の場合の出力結果:**

[code]

    n? 4
    1
    n? 5
    1
    n? 0
    1
    ...
    ...
    
[/code]

条件をひっくり返しているだけなので動作すると思ったのですが、想定外の動作となってしまいました。

初歩的な質問で恐縮ですが、それぞれの動作が異なる原因を教えていただきたいです。


CC BY-SA 4.0
2022-07-02T18:38:42.267
89725
2023-01-23T11:56:47.937
2022-07-03T04:55:49.980
3060
53328
question
c
無限ループに条件分岐を設定したが想定外の動作となる


`x = 0` では `x` にゼロを入れてしますからです。  
`x == 0` の間違いではないですか、論理式ですよね。


CC BY-SA 4.0
2023-01-23T11:25:05.880
93526
2023-01-23T11:56:47.937
2023-01-23T11:56:47.937
3060
56727
89725
answer