🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

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

Q&A

解決済

2回答

2225閲覧

C言語 構造体アクセスと後置インクリメントの優先順位

justAman22

総合スコア1

C

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

0グッド

0クリップ

投稿2021/03/14 08:53

編集2021/03/14 08:54

構造体.p++とした場合、

  1. 構造体アクセス(.)と後置インクリメント(++)は同じ優先度。
  2. 結合順序は左から右。
  3. 後置インクリメントはインクリメントする前の値を評価値として返す。

ことから、((構造体.p)++)となると思うのですが、実際には(構造体.(p++))になりました。(((構造体.p)++)が実際にどう評価されるのかはよくわからないですが)

C

1#include <stdio.h> 2#define SIZE 5 3 4struct ST { 5 int* a; 6} st; 7int b[SIZE]; 8 9void print_all(void) { 10 int i; 11 for (i = 0; i < SIZE; i++) { 12 printf("%d: %d\n", i, b[i]); 13 } 14} 15 16int main(void) { 17 st.a = b; 18 *(st.a++) = 1; 19 20 print_all(); 21 22 return 0; 23}

出力:

0: 1 1: 0 2: 0 3: 0 4: 0

しかし、(構造体.(p++))だとしても(構造体.(p++を評価した値))となるのでなにかおかしい気がします。よくわからなくなってきました。構造体アクセスと後置インクリメントが同じ式に現れた場合どういう動作になるのでしょうか?

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

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

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

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

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

guest

回答2

0

ベストアンサー

実際には(構造体.(p++))になりました。

これは意味不明です。pは変数じゃない(メモリ上のエリアが無い)のでインクリメントできません。
構造体.pで初めてメモリ上のエリアを意味します。

後置インクリメントの理解不足では?

C

1*(st.a++) = 1;

は、

C

1*(st.a) = 1; 2st.s++;

と同じなので、*b1が代入されます。

投稿2021/03/14 09:06

otn

総合スコア85888

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

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

justAman22

2021/03/14 09:19

嘘みたいな話なのですが、「((構造体.p)++)となると思うのですが、実際には(構造体.(p++))になりました。」の言っている意味がよくわかりません。ちょっと頭を冷やします。
justAman22

2021/03/14 09:33 編集

ポインタpがアドレス0x0001としたとき、 p -評価-> 0x0001 p++ -評価-> 0x0001 その後インクリメント st.a -評価-> 0x0001 st.a++ == (st.a)++ == (0x0001)++ と謎の勘違いをしてしまったみたいです。 (p)++ -評価-> 0x0001 その後インクリメント であるにも関わらず。
justAman22

2021/03/14 09:40 編集

C言語においての式の”評価”というのがよくわかっていないみたいです。式を評価するということがどういうことか詳しく解説されている本とか知りませんか?やっぱり規格表を熟読するしかないのでしょうか?
otn

2021/03/14 10:09

評価というのは、式の字面から、値の数値(数値計算の場合)を求めることです。 2つ目のコメントは意味がわかりません。
justAman22

2021/03/14 11:43

1+1を評価したら2であることはわかるのですが、a=1を評価するとか、a = (b = 10 + 3) = 3を評価するとか、よくわからなくなってきます。「式」が数学でとかで使う式とは少し指すものが違うのでしょうね。お付き合いいただきありがとうございました。
otn

2021/03/14 12:28 編集

> 「式」が数学でとかで使う式とは少し指すものが違うのでしょうね。 そうですね。数学の式は言明と言えると思いますが、プログラミング言語の式は、実行される物です。 このサイトの質問でたまに見る誤解ですが、 a = 1 b = a a = 3 と書くと、b = a と書いてあるので、a = 3 と書くと b まで 3 になると思っている人が居るようです。 これは式を言明と思っていると言うことでしょう。
justAman22

2021/03/14 12:22

最近、C言語の変数は箱というより、決まったメモリ領域にはられたラベルようなものだと感じています。
guest

0

値が評価されてから、インクリメントされます
*(st.a) = 1;
st.a=st.a+1;
ってことですね

投稿2021/03/14 09:00

y_waiwai

総合スコア88038

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

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

justAman22

2021/03/14 11:47

インクリメントが結局はa += 1、 a = a+1 であることがきれいに抜け落ちてました。この回答を見てそのことに気づきました。なぜ気づかなかったのか、ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問