添字演算子内のインクリメント

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
cookierinon

添字演算子内のインクリメント

#1

投稿記事 by cookierinon » 11年前

C言語初心者です。プログラミング言語C 第2版(K&R)の内容について質問させていただきます。 P58の

コード:

/* squeeze: sからcをすべて取り除く */
void squeeze(char s[], int c)
{
    int i,j;

    for(i = j =0; s[i] != '0'; i++)
        if(s[i] != c)
            s[j++] = s[i];
    s[j] = '0';
}
内の
s[j++] = s;
が、
s[j] = s;
j++;
と同等であるのがわからないのです。
私の誤った解釈では
s[j++] = s;
は、
j++;
s[j] = s;
と、演算子の優先度から考えてインクリメント→代入が行われると思うのですが…

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

Re: 添字演算子内のインクリメント

#2

投稿記事 by softya(ソフト屋) » 11年前

本に前置と後置のインクリメントの違いの説明があると思うのですが、文法でそう決まっているなら誰がなんと言おうとそういう動作をする物です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

zeek

Re: 添字演算子内のインクリメント

#3

投稿記事 by zeek » 11年前

> s[j++] = s;
j++ という式の値と j という変数の値と区別して考えないと理解できません。
j++ という式の値はインクリメントする前の j の値と規定されています。
また、変数 j の値が 1 増加するのは副作用完了点(上記式では ; )までの任意のタイミングです。
演算子が式の値を求めるだけでなく変数の値も変化させる(副作用がある)演算になるととたんに変数の値と混乱してしまう人が多いです。
s[!j] = s;
であれば !j の式の値を使うのと同じで
s[j++] = s;
であれば j++ の式の値を使い j 変数の値を直接使うわけではありません。

かずま

Re: 添字演算子内のインクリメント

#4

投稿記事 by かずま » 11年前

演算には 2つの効果があります。
ひとつは、演算結果の値を新たに作り出すこと。
もう一つは副作用と言って、演算結果以外に何かをやらかすことです。

a = 5, b = 3 のとき、a - b という演算で 2 という演算結果を生み出しますが、
a も b も元の値のままです。
二項演算子の - には副作用がありません。

-a という演算で -5 という演算結果を生み出しますが、a は元の値のままです。
単項演算子の - にも副作用はありません。

後置++ は副作用のある演算子です。
j = 3 のとき、j++ の演算結果は 3 です。副作用で j は 4 になります。

前値++ も副作用のある演算子です。
i = 3 のとき、++i の演算結果は 4 です。副作用で i は 4 になります。

s[j++] ですが、j++ の演算結果である「j の元の値」が使用されます。
副作用による「1増えた j の値」は使用されません。

cookierinon

Re: 添字演算子内のインクリメント

#5

投稿記事 by cookierinon » 11年前

式の値という概念(?)と副作用(←初耳でした)の知識がなかったため混乱しているのだとわかりました。
とても適切なご指摘、ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る