0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

オペランドと演算子について(結合と演算の優先順位)

Posted at

ポインタについて勉強し始めて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の中身をインクリメントしてしまうのでは…?と勘違いしてしまいました。

0
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?