teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

4

もうちょっと修正

2021/09/29 13:13

投稿

thkana
thkana

スコア7735

answer CHANGED
@@ -24,4 +24,4 @@
24
24
  `b=4/3*c*c, a=b=!a`は
25
25
  まずb=4/3*c*cを評価して4/3*c*cを計算して結果をbに代入します。
26
26
  つぎに`a=b=!a`では、`=`は右辺から先に処理されますから、まずb=!aで、`!`は(これは単独の!)否定の演算子、!に続く値が真(0以外)なら偽(0)を、偽なら真(1)を返し、これbに代入してその値を返します(真偽の判断のときには0以外を真としますが、返す値の真偽では1が真です。ときどき「0以外の不定の値を返す」と勘違いしている人もいます)。
27
- aは2、これは0以外なので、!aは0、これをbに代入してb=!aは0を返し、`a=(b=!a)`で式全体も0を返して`4/3*c*c, a=b=!a`の値も0。これがb代入されます。
27
+ aは2、これは0以外なので、!aは0、これをbに代入してb=!aは0を返し、`a=(b=!a)`で式全体も0を返しますが、これを受け取る人は誰もいないので捨られておわり、です。結局ab0になって、cの値は変わらず、で

3

指摘に基づき修正

2021/09/29 13:12

投稿

thkana
thkana

スコア7735

answer CHANGED
@@ -21,7 +21,7 @@
21
21
  3つ目
22
22
  カンマ演算子は、`,`の左側の式、右側の式を順次評価し、右側の式の値を返す演算子です。
23
23
  また、`=`は代入の演算子で、右辺の値を左辺の変数に代入するとともに、左辺に代入された値を返します(int a;に対してa=1.5などとすると式の値は1になる)。
24
- `4/3*c*c, a=b=!a`は
24
+ `b=4/3*c*c, a=b=!a`は
25
- まず4/3*c*cを評価しますがその値は捨てます(つまりこの場合は全く無意味)
25
+ まずb=4/3*c*cを評価して4/3*c*cを計算して結果をbに代入します。
26
- `=`は右辺から先に処理されますから、まずb=!aで、`!`は(これは単独の!)否定の演算子、!に続く値が真(0以外)なら偽(0)を、偽なら真(1)を返し、これbに代入してその値を返します(真偽の判断のときには0以外を真としますが、返す値の真偽では1が真です。ときどき「0以外の不定の値を返す」と勘違いしている人もいます)。
26
+ つぎに`a=b=!a`、`=`は右辺から先に処理されますから、まずb=!aで、`!`は(これは単独の!)否定の演算子、!に続く値が真(0以外)なら偽(0)を、偽なら真(1)を返し、これbに代入してその値を返します(真偽の判断のときには0以外を真としますが、返す値の真偽では1が真です。ときどき「0以外の不定の値を返す」と勘違いしている人もいます)。
27
27
  aは2、これは0以外なので、!aは0、これをbに代入してb=!aは0を返し、`a=(b=!a)`で式全体も0を返して`4/3*c*c, a=b=!a`の値も0。これがbに代入されます。

2

指摘があったので修正

2021/09/29 13:06

投稿

thkana
thkana

スコア7735

answer CHANGED
@@ -3,7 +3,7 @@
3
3
  > ・1つ目のprintfまでのコマンドに関して
4
4
  <略> !の式が理解できません。調べると否定の意味を持つとあった
5
5
 
6
- 独立した`!`があるわけではありません。`!=`で一つの演算子です。`!=`は、演算子の左辺と右辺の値が異なればint型の1を、等しければ0を返します。もちろん、字面としては`==`との対比で「等しいことの否定」を意図はしているでしょうけれど。
6
+ プログラムをよく見てください。(a!=b)です。`!`ではなく、`!=`で一つの演算子です。`!=`は、演算子の左辺と右辺の値が異なればint型の1を、等しければ0を返します。もちろん、字面としては`==`との対比で「等しいことの否定」を意図はしているでしょうけれど。
7
7
 
8
8
  2つ目
9
9
  三項演算子は、その言葉のとおり3つの項を処理し、一つの値を返します。

1

誤記修正

2021/09/28 23:50

投稿

thkana
thkana

スコア7735

answer CHANGED
@@ -23,5 +23,5 @@
23
23
  また、`=`は代入の演算子で、右辺の値を左辺の変数に代入するとともに、左辺に代入された値を返します(int a;に対してa=1.5などとすると式の値は1になる)。
24
24
  `4/3*c*c, a=b=!a`は
25
25
  まず4/3*c*cを評価しますがその値は捨てます(つまりこの場合は全く無意味)。
26
- `=`は辺から先に処理されますから、まずb=!aで、`!`は(これは単独の!)否定の演算子、!に続く値が真(0以外)なら偽(0)を、偽なら真(1)を返します(真偽の判断のときには0以外を真としますが、返す値の真偽では1が真です。ときどき「0以外の不定の値を返す」と勘違いしている人もいます)
26
+ `=`は辺から先に処理されますから、まずb=!aで、`!`は(これは単独の!)否定の演算子、!に続く値が真(0以外)なら偽(0)を、偽なら真(1)を返し、これbに代入してその値を返します(真偽の判断のときには0以外を真としますが、返す値の真偽では1が真です。ときどき「0以外の不定の値を返す」と勘違いしている人もいます)
27
27
  aは2、これは0以外なので、!aは0、これをbに代入してb=!aは0を返し、`a=(b=!a)`で式全体も0を返して`4/3*c*c, a=b=!a`の値も0。これがbに代入されます。