70524


関数diffを2つの値xとyの差（大きい方から小さい方を引いた値）を返す関数とし、それを以下のようにプログラムしたのですが、どんな数字を入れても差は0という結果しか出力されませんでした。

[code]

    #include <stdio.h>
    
    /* 2つの値 x, y の差(大きい方から小さい方を引いた値)を返す関数 */
    int diff(int x, int y)
    {
        int diff;
    
        if (x>=y) {
            diff=x-y;
        }
        else if(y>x){
            y-x;
        }
    
        return diff;
    }
    
    int main(void)
    {
        int x, y;
    
        printf("整数 x を入力してください：");
        scanf("%d",&x);
        printf("整数 y を入力してください：");
        scanf("%d",&y);
        printf("整数 x と y の差は %d です．\n", diff(x,y));
    
        return 0;
    }
    
[/code]

**実行結果**

[code]

    $ ./a.out
    整数 x を入力してください：13
    整数 y を入力してください：34
    整数 x と y の差は 0 です．
    
[/code]

上記のような実行結果しか出力されなかったのですが、自分では欠損点が見つからなかったので聞いている次第です。  
ご回答よろしくお願いします。


CC BY-SA 4.0
2020-09-18T12:21:15.487
70523
2020-09-18T13:53:08.170
2020-09-18T13:07:25.357
3060
41837
question
c
コンパイルはできるので、どこがおかしいかわからない。


y>xの場合にdiffに差を格納していないからですね。  
(x>=yの場合は修正前のプログラムでも正しい結果が出ています。)

[code]

            if (x>=y) {
                    diff=x-y;
            }
            else if(y>x){
                    /* y-x; diffに格納していない。 */
                    diff=y-x; /* diffへ格納するように修正 */
            }
    
[/code]


CC BY-SA 4.0
2020-09-18T12:31:43.777
70524
2020-09-18T12:31:43.777
30745
70523
answer


既に解決済みですので参考までに。

例えば gcc ではスイッチオプションに `-Wunused-value` を追加すると(`-Wall` でも可)、以下の様に warning
message を表示してくれます。

[code]

    $ gcc -std=c18 -Wunused-value -g diff_values.c
    diff_values.c: In function ‘diff’:
    diff_values.c:12:6: warning: statement with no effect [-Wunused-value]
       12 |     y-x;
          |     ~^~
    
[/code]

ちなみに、三項演算子(`ternary operator`)を使うと以下の様にも書くことができます(macro でもよいかもしれません)。

[code]

    int diff(int x, int y)
    {
      return (x>y) ? (x-y) : (y-x);
    }
    
[/code]


CC BY-SA 4.0
2020-09-18T13:53:08.170
70525
2020-09-18T13:53:08.170
70523
answer