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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Q&A

解決済

4回答

7707閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

1グッド

0クリップ

投稿2020/10/05 13:11

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(条件式)以外使って来なかったのでどうも説明できません。
ご教示頂けますでしょうか。

Bull👍を押しています

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

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

C

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

は、以下と同じです。

C

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

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

C

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

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

C

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

投稿2020/10/05 13:42

編集2020/10/05 15:38
Y.H.

総合スコア7914

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2020/10/05 14:25

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

2020/10/05 15:26

指摘ありがとうございますm(..)m 回答修正しておきました。
退会済みユーザー

退会済みユーザー

2020/11/23 09:07

ありがとうございます。大変詳しくお教えいただいて助かります。高評価が多かったのでベストとさせていただきます。
guest

0

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

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

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

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

投稿2020/10/05 13:24

編集2020/10/05 13:47
Daregada

総合スコア11990

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

投稿2020/10/05 13:14

編集2020/10/05 13:27
SHOMI

総合スコア4079

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

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

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

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

[1] 代入演算子の場合

C

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

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

C

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

は同じことになります。

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

  • 非0ならば真
  • 0ならば偽

と判断します。

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

C

1a = 0 2if (b = a)

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

[2]比較演算子の場合

次の例を挙げます。

C

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

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

  • aとbを比較し、一致した場合、評価値は"1"になる
  • aとbを比較し、一致しない場合、評価値は"0"になる

上の例では"a == b"の評価値は"1"です。
(2)ではif文の評価対象は"a == b"です。上の例では

C

1if (a == b) 2if (1)

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

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

C

1if (a == b) 2if (0)

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

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

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

投稿2020/10/17 21:43

toitoburuku9

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問