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

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

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

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

Q&A

解決済

3回答

331閲覧

インクリメントを使った演算式について。

attama

総合スコア7

C

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

0グッド

0クリップ

投稿2018/01/31 16:11

__イタリックテキスト__インクリメントを使った計算方法について

今プログラミングの授業をしており問題が出されたのですが、サイト等見て考えてみた結果が答えと一致しないので質問させていただきました。

///////////////////////////////////////////////////////////////////

[出された課題]
a=3,b=5の時wの値が1となるものはどれか。

アw=++b%a
イw=--b%a
ウw=b++%a
エw=b--%a

答えは"ウ"とのことなのですがなぜ"ウ"だけなのか理解できておりません。
[理由]
私は"イ"と"ウ"が正解だと思っておりました。自分なりに調べてみたら前置インクリメントの場合は先に変数に+1して計算すると思っていたので 4%3となり1になると思ったからです。

[出された課題]
a=5,b=2の時wの値が1になるものはどれか。

アw=++a/++b
イw=++a/b++
ウw=a++/++b
エw=a++/b++

答えは"エ"なのですが、前置インクリメントは先に1を加える、後置インクリメントは計算後に1を加えるを前提として考えた結果どれも当てはまらないのでとても困っております。

"エ"の場合、5/2の後に2を加えて4.5になってしまうのですがなにか根本的に考え方を間違えているのでしょうか。

とても初歩的な質問にはなってしまいましたがどうかよろしくお願い致します。

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

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

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

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

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

guest

回答3

0

ベストアンサー

写し間違えでなければ、その回答は誤りですね。


a=3,b=5の時wの値が1となるものはどれか。

ア: w=++b%a

イ: w=--b%a
ウ: w=b++%a

エ: w=b--%a

attamaさんの考えが正しく、正解はイです。Wandbox


a=5,b=2の時wの値が1になるものはどれか。

ア: w=++a/++b

イ: w=++a/b++
ウ: w=a++/++b

エ: w=a++/b++

正解はウです。Wandbox

"エ"の場合、5/2の後に2を加えて4.5になってしまうのですがなにか根本的に考え方を間違えているのでしょうか。

誤解されている点が二つあります。

  1. C言語では、整数で整数を割ったときの結果は小数点以下切り捨てで整数になります。
  2. インクリメントは対象の変数(オペランド)に対して行われ、結果に直接的には影響しません。

その点を踏まえると、エの計算結果は2となり、計算後にaが6、bが3になります。

投稿2018/01/31 16:26

LouiS0616

総合スコア35658

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

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

attama

2018/01/31 16:38

LouiS0616さん この度は回答をしてくださり本当にありがとうございました。 誤解まで指摘していただけて本当に助かりました。 明日も授業があるので先生に少し尋ねてみようと思います。
guest

0

Cでの式の計算結果に関しては ++Xは(X+1)とおなじ、X++はXと同じです(すでに書かれているように1つの式に同じ変数が複数回出てくるとかの禁じ手の場合は別)。式の計算が終わったとではどちらの場合も式の計算ができているだけでなくaの値が一つ増えています(副作用)。

たとえば

w=a++/++b

は、

{ b=b+1;w=a/b;a=a+1;} ```と同等だととらえておいてまぁいいんじゃないでしょうか。で、wに何が入るかという観点では ```ここに言語を入力 {b=b+1;w=a/b;}

と同じで、結局

w=a/(b+1)

と同じ結果がwに入ります。

投稿2018/02/01 07:25

a_saitoh

総合スコア702

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

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

0

解決済みですが一言 まあ今回は課題みたいですけど。

C言語においては式の中の計算順には未定義なものがあります。たとえば、インクリメントする一つの変数を式の中で複数回使う場合などは計算順が確定しません(複数通りの結果が起こり得る)。ですので、あまりにも複雑ならば式を(文として)分割するのも一つの方法です。

投稿2018/01/31 22:06

HogeAnimalLover

総合スコア4830

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

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

maisumakun

2018/05/18 07:26

計算順が確定しないを通り越して、「未定義の動作」という、理解不能な領域に突入してしまいます。 たとえば、i=3から「i=i++;」としたら、iが7になってしまった、なんていう事例があったという話もあります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問