質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.80%

if(代入式)の意味について

受付中

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 329

sley_ji

score 10

C言語、プログラミングについてです。

次の文が文法的に正しいことを説明しないさい。また、どのように動作するプログラムであるかを、0と非0の言葉を用いて説明しなさい。

#include <stdio.h>
int main (void) {
int a,b;
scanf(“%d”, &a);
if(b = a)
 printf(“0以外の値がbに代入された.¥n”);
else 
 printf(“0がbに代入された.¥n”);
}


(a = b)が成り立てば実行、成り立たなければ実行しないというようなよくある真偽に関する問題かと思ったのですが…
しかし(a = b)で0代入されていても(a = b)は成り立ちますよね、それでは成り立つ(真)成り立たない(偽)の話では説明できないのかなと思い始めました、

if(条件式)以外使って来なかったのでどうも説明できません。
ご教示頂けますでしょうか。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+4

if文は条件式に記載された式の値が0の場合に偽、0以外の場合に真として判断します。
b = aという式は、baを代入し式の値としてbを返します。

//・・・略
if(b = a) printf(“0以外の値がbに代入された.¥n”);
else      printf(“0がbに代入された.¥n”);


は、以下と同じです。

//・・・略
b = a;
if(b) printf(“0以外の値がbに代入された.¥n”);
else  printf(“0がbに代入された.¥n”);

b != 0も式で、比較の結果、偽の場合は0、真の場合は1が式の値となります。

//・・・略
b = a;
if(b != 0) printf(“0以外の値がbに代入された.¥n”);
else       printf(“0がbに代入された.¥n”);


は以下のようにも書けます。

int conditions = 0;
//・・・略
b = a;
conditions = (b != 0);
if(conditions) printf(“0以外の値がbに代入された.¥n”);
else           printf(“0がbに代入された.¥n”);

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/10/05 23:25

    > 真の場合は0以外(処理系依存ですが
    違います。比較の演算子は、成り立つ場合int型の1を返すことがCの規格に明記されています。処理系への依存性はありません。

    キャンセル

  • 2020/10/06 00:26

    指摘ありがとうございますm(..)m
    回答修正しておきました。

    キャンセル

+1

代入の結果が返るので、baを代入した上でif(a)ということになります。
つまり、0を代入した場合はif(0)0以外(非0)を代入した場合はif(非0)、です。
int c = (b = a);としてaの値を変えた場合にcの値がどうなるか確認してみて下さい。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

C言語の=に、「等しい」という意味はありません。左右の値が等しいか比較する演算子は==です。

b = aという式は、「変数bに変数aの値を代入するとともに、bの値を式の値とする」というだけの意味しか持ちません。変数aの値と変数bの値が等しいからどうこう、というのはまったく関係ない話です。

if文の条件式には、比較演算子を使った式以外も書くことができ、「式の値が0以外なら条件が成立し、0なら成立しない」という動作になります。

つまり、b = aと条件式に書くと、代入後の変数bの値が0以外なら条件が成立し、0なら条件が成立しない、ということです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

推測ですが、与えられた問題は、

  1. C言語において"="(代入演算子)と"=="(比較演算子)の違いを理解しているか
  2. if文の条件分岐を文法的に厳密に理解しているか

を問う設問だと思います。

以下、例を挙げて説明します。評価値とは、「その値を評価したもの」です。

[1] 代入演算子の場合

a = 5;     // (1) 仮に、a = 5とします。
b = a      // (2) 代入演算子
if (b = a) // (3) if文の評価対象が b = a


(1)はわかると思います。"a"の評価値は"5"です。
(2)は「bにaの値を代入する」という意味です。"b = a"の「評価値」は"5"になります。
(3)はif文の評価対象が"b = a"です。この例の場合

if (b = a)
if (5)


は同じことになります。

次に、if文の分岐条件を正確に記述します。
if文は後に続く()の中の値が

  • 非0ならば真
  • 0ならば偽
    と判断します。

上の例では、if文の中の値は"5"ですので、"真"となり、
"0以外の値がbに代入された"ということになります。

a = 0
if (b = a)


の場合、if文の評価対象は"0"ですので、"偽"となり、
"0がbに代入された"ということになります。

[2]比較演算子の場合

次の例を挙げます。

a = 5;      // 
b = 5;      //
a == b      // (1)
if(a == b)  // (2)


(1)では"=="つまり比較演算子を使っています。
比較演算子では、

  • aとbを比較し、一致した場合、評価値は"1"になる
  • aとbを比較し、一致しない場合、評価値は"0"になる
    上の例では"a == b"の評価値は"1"です。
    (2)ではif文の評価対象は"a == b"です。上の例では
if (a == b)
if (1)


は同じことですので、if文は"真"となり、if文の直後の文が実行されます。

もし、a = 5, b = 3の場合、

if (a == b)
if (0)


は同じことになり、if文は"偽"ですので、if文の直後の文は実行されません。

以上、長くなりましたが、if文に関してご説明しました。
まとめると、
if文は、評価対象の値が非0ならば真、0ならば偽となるため、設問にあったプログラムは正しい。
ということになります。

参考にしていただけると幸いです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る