UbuntuでのTerminal画面です。
・1つ目のprintfまでのコマンドに関して
a%2 = 1 (15/2の余り1)と解釈したのですが、!の式が理解できません。調べると否定の意味を持つとあったのですが、具体的にそういう処理をしてc=1になったのか教えていただきたいです。
・2つ目のprintfまでのコマンドに関して
c = a>b = 2>5 これは偽なのでb++ の処理が行われ、a=2,b=6 が出力されることは分かるのですが、これも元々の c=15 から c=5になる過程がよくわかりません。
・3つ目のprintfまでのコマンドに関して
b = 4/3cc = 4/311 = 4/3 だと思うのですが、そのあとの a = b = !a の処理がよくわかりません。
質問が多くて申し訳ありません。どなたかご教授いただけると幸いです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
ベストアンサー
「演算子」は、C言語においては「1~3個の値を処理して、1つの値を返す」ものです。
・1つ目のprintfまでのコマンドに関して
<略> !の式が理解できません。調べると否定の意味を持つとあった
プログラムをよく見てください。(a!=b)です。!
ではなく、!=
で一つの演算子です。!=
は、演算子の左辺と右辺の値が異なればint型の1を、等しければ0を返します。もちろん、字面としては==
との対比で「等しいことの否定」を意図はしているでしょうけれど。
2つ目
三項演算子は、その言葉のとおり3つの項を処理し、一つの値を返します。
a>b ? ++a : b++
まずa>bを調べ、
その値が真(0以外)であったら ++aを評価(計算を実行)して結果の値を
その値が偽(0)であったら b++を評価して結果の値を
返します。
aが2、bが5の場合であれば、
a>bは偽なので、
b++ (式の値としてはbを返した後、bの値を1増加する)
で、つまり(a>b ? ++a : b++)
の値は5、これがCに代入され、
またbの値は6になっています。
3つ目
カンマ演算子は、,
の左側の式、右側の式を順次評価し、右側の式の値を返す演算子です。
また、=
は代入の演算子で、右辺の値を左辺の変数に代入するとともに、左辺に代入された値を返します(int a;に対してa=1.5などとすると式の値は1になる)。
b=4/3*c*c, a=b=!a
は
まずb=4/3ccを評価して4/3ccを計算して結果をbに代入します。
つぎにa=b=!a
では、=
は右辺から先に処理されますから、まずb=!aで、!
は(これは単独の!)否定の演算子、!に続く値が真(0以外)なら偽(0)を、偽なら真(1)を返し、これbに代入してその値を返します(真偽の判断のときには0以外を真としますが、返す値の真偽では1が真です。ときどき「0以外の不定の値を返す」と勘違いしている人もいます)。
aは2、これは0以外なので、!aは0、これをbに代入してb=!aは0を返し、a=(b=!a)
で式全体も0を返しますが、これを受け取る人は誰もいないので捨てられておわり、です。結局aとbは0になって、cの値は変わらず、ですね。
投稿2021/09/28 23:16
編集2021/09/29 13:13総合スコア7703
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/28 23:37
2021/09/28 23:48
2021/09/28 23:55
2021/09/29 00:00
2021/09/29 00:07
2021/09/29 00:19
2021/09/29 00:20
2021/09/29 01:02
2021/09/29 03:23
2021/09/29 06:04
2021/09/29 13:08
0
C言語としては、論理型ってのはなく、論理値ってのは、ぶっちゃけ整数の0(偽)か1(真)です
そういうことでその計算式を見ればわかるかと
#んで、整数の0は偽、それ以外は真と判断されます
投稿2021/09/28 22:02
総合スコア88042
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/29 06:04
2021/09/29 07:47
2021/09/29 07:53
2021/09/29 08:01
2021/09/29 08:03
0
int a=15, b=15, c=15;
c = (a%2) + (a!=b);
c = (aを2で割った余り) + (a!=b ならば 1, さもなくば 0) なので
c = 1 + 0
c = 1
int a=2, b=5, c=15;
c = a>b ? ++a : b++;
c = (a>b ならば ++a, さもなくば b++); なので
c = b++;
c = b; b = b+1;
int a=2, b=15, c=1;
b = 4/3cc; a=b=!a;
b = 4/3/cc; a = (b= !a);
b = 4/3/cc; a = (b= (a が 0 ならば 1, さもなくば 0)); なので
b = 4/311; a = (b= 0);
※ 代入式 b = 0 の値はその右辺と等しく 0
投稿2021/09/28 21:39
総合スコア16612
0
a%2 = 1 (15/2の余り1)と解釈したのですが、!の式が理解できません。
!の式は否定を意味します。if(a != b)
のようにするとaとbの値が違う時のみ中に入るという式になります。得られる数字は0か1なので、今回の式では0が返却され、%2の答えである1がそのまま答えになっています。
c=15 から c=5になる過程がよくわかりません。
C言語の仕様で++a
とa++
の処理には下記のような明確な違いがあります。
- 前に++をつけることは、処理した後に+=1が実行される
- 後に++をつけることは、処理する前に+=1が実行される
今回の場合三項演算子の式が処理にあたるので、元のbの数字がcに入るような式になっています。
そのあとの a = b = !a の処理がよくわかりません。
int型のaを否定している、つまりTrueかFalseの答えになります。
int型の場合1以外は全部False扱いになっていたはずなので、False(0)が入っているのかと思われます。
※全体的にこのプログラムは私自身、あまり見たことない書き方です。実務でやると怒られるのでやめましょう。
投稿2021/09/28 21:26
総合スコア3307
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/28 21:35
2021/09/28 23:19
2021/09/28 23:40
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。