ページ 1 / 1
添字演算子内のインクリメント
Posted: 2014年7月25日(金) 19:06
by cookierinon
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;
と、演算子の優先度から考えてインクリメント→代入が行われると思うのですが…
Re: 添字演算子内のインクリメント
Posted: 2014年7月25日(金) 19:43
by softya(ソフト屋)
本に前置と後置のインクリメントの違いの説明があると思うのですが、文法でそう決まっているなら誰がなんと言おうとそういう動作をする物です。
Re: 添字演算子内のインクリメント
Posted: 2014年7月25日(金) 20:17
by zeek
> s[j++] = s;
j++ という式の値と j という変数の値と区別して考えないと理解できません。
j++ という式の値はインクリメントする前の j の値と規定されています。
また、変数 j の値が 1 増加するのは副作用完了点(上記式では ; )までの任意のタイミングです。
演算子が式の値を求めるだけでなく変数の値も変化させる(副作用がある)演算になるととたんに変数の値と混乱してしまう人が多いです。
s[!j] = s;
であれば !j の式の値を使うのと同じで
s[j++] = s;
であれば j++ の式の値を使い j 変数の値を直接使うわけではありません。
Re: 添字演算子内のインクリメント
Posted: 2014年7月25日(金) 20:25
by かずま
演算には 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 の値」は使用されません。
Re: 添字演算子内のインクリメント
Posted: 2014年7月25日(金) 20:55
by cookierinon
式の値という概念(?)と副作用(←初耳でした)の知識がなかったため混乱しているのだとわかりました。
とても適切なご指摘、ありがとうございました。