感謝のプログラミング 10000時間

たどり着いた結果(さき)は、感謝でした。

複合演算子と単項演算子

<スポンサーリンク>

昨日Objective-Cでクラスやメソッドを作る勉強をしていて、つまづいたところをブログに書いたら、コメントをいただいた。
こういうの、ブログやっててほとんどないから、本当に嬉しい。
はてなブックマークで悪口書かれたときもあるけれど、ブログやっててよかったな〜って思う。

 > age *= val; *=は、複合代入演算子なので、 age = age * val; と同じ意味ですね。 
ageに初期値が設定されていないので、 0 * val と同じ意味になり、 
0がセットされてしまうのだと思います。 
この場合はインスタンス変数に引数で渡した値をセットすれば良いだけなので、
後半部分で書かれているように、 age = val; で大丈夫です。

さて、せっかく教えていただいたんだから、自分の中でちゃんと消化したい。
本当にObjective-Cのことを全然わかっていないので、昨日読んだ本をもう一度調べていく。

(後から追記)
調べていくうちに、Objective-Cというか、プログラミングの基礎の基礎だったことに気付いて、恥ずかしくなった。
でも、恥ずかしい思いができてよかった!
通りすがりさん、ありがとうございます。
(追記ここまで)

単項代入演算子と複合代入演算子

まず、オペランドを2つ用いて計算する演算子のことを二項演算子という。

1 + 2

だったら、「1」と「2」がオペランド。2つあるから、二項演算子だ。

-2

とかだったら、オペランドが「1」だけ。

それで、この演算子の真ん中にある「+」とか「-」のことを単項演算子という。

単項演算子には、

  1. :単項プラス演算子

!:論理否定演算子
^:ビット補数演算子

    1. :インクリメント演算子

--:デクリメント演算子
():指定した型名に変換する

複合代入演算子とは、「変数aの値を1増やした値にしたい」とかいうときに使う。

  1. =とか、-=とか、そして、コメントで指摘いただいた「*=」も複合演算子だった。

ポインタは全く関係なかった。恥ずかしい。
そういうところも馬鹿にせずに教えてもらえて本当にありがたいです。

Objective-Cには5つの複合演算子が用意されていて、

  1. =:a = a + 1
  • =:a = a - 1

=:a = a * 2

/=:a = a / 2
%=:a = a % 2
のような意味になる。

複合演算子を使ったサンプルは以下の通り。

int main (int argc, const char * argv[])
{
    
    int a = 10;
    int b = 20;
    int c = 30;
    int d = 40;
    int e = 50;
    
    a += 2;
    b -= 2;
    c *= 2;
    d /= 2;
    e %= 2;
    
    NSLog(@"a=%d", a);
    NSLog(@"b=%d", b);
    NSLog(@"c=%d", c);
    NSLog(@"d=%d", d);
    NSLog(@"e=%d", e);

    return 0;
}

結果は以下の通り。

2013-10-23 01:26:47.705 mytest[338:903] a=12
2013-10-23 01:26:47.709 mytest[338:903] b=18
2013-10-23 01:26:47.710 mytest[338:903] c=60
2013-10-23 01:26:47.711 mytest[338:903] d=20
2013-10-23 01:26:47.711 mytest[338:903] e=0

読んだ本

Objective-C超入門 改訂第2版――ゼロからしっかり学べるiPhoneプログラミング【Xcode 4.6で解説】

Objective-C超入門 改訂第2版――ゼロからしっかり学べるiPhoneプログラミング【Xcode 4.6で解説】

ちゃんと最初に読んでいたこの本に書いてあったのに、読み逃していた。
詳しい説明は4-3章にちゃんと書いてあった。
今度からはもっと丁寧に勉強すると心に決めた。