ポインタについて勉強し始めて3日目。以下のようなコードに遭遇しました。
C
int str_chr(const char *s, int ch)
{
int idx = 0;
while (*s)
{
if (*s++ == ch)
return idx;
idx++;
}
return -1;
}
このコードは、chを検索キーとして文字列s
に対して検索をかけ、ch
があればその添え字を返し、なければ-1を返すというもの。
s
は文字列の先頭アドレスを指すポインタであり、*s
で中身を参照できる。
if文の条件式の中でポインタをインクリメントし、検索キーに一致する文字が見つかったら、idx
の値を返して終了。
一致する文字が見つからない場合(つまり*sがヌル文字になった場合)、while
ループには突入せず、-1を返して処理終了。ということだが、
このif(*s++ == ch)
という書き方で、なぜポインタがインクリメントされるのか分からなくて躓いてました。演算子とオペランドの結合の優先順位と、演算の優先順位のことがよくわかってなかったのが原因でした。
if(*s++ == ch)
で何が行われているか
前提知識
-
++(後置インクリメント演算子)
の方が、*(ポインタの間接参照演算子)
より優先度が高い -
++
の意味は「その式全体の評価が終わった後に、結合しているオペランドの値を+1する」
①まずはs
に++
が結合し、s++
となる。左辺は*(s++)
となる。まだインクリメントはされない。
②*s == ch
が評価される
③ s
がインクリメントされる
パッと見たとき、(*s)++
のように読んでしまい、s
の中身をインクリメントしてしまうのでは…?と勘違いしてしまいました。