Hatena::ブログ(Diary)

Windchase

2009.4.24

割り算に ÷ 記号を使わない地域

世界には、割り算に ÷ 記号を使わない地域があるらしいと聞いたことがあるのだが、実際にどうなっているのか気になったので、Twitter と IRC で訊いてみた。

その結果、北欧と低地諸国では ÷ 記号を使っていないことがわかった。

  • ÷ を使っている国
    • 日本、US、UK、ドイツ、オーストリア、スペイン、オーストラリア、アルゼンチン、中国
  • ÷ をほとんど使っていない国
    • デンマーク、ノルウェー、スウェーデン、フィンランド、オランダ、ベルギー、ルクセンブルク

使っていない国の中でも、オランダでは計算器に ÷ ボタンがあるのが自然だが、北欧では / ボタンのほうが自然だとか、微妙な違いがあるのはおもしろい。

北欧出身でデンマーク在住の友人の意見を紹介しておく。

I think / is the most commonly used

actually think we used : rather than ÷ in public school, but not 100% sure

personally I am always delayed when I can’t find / on a calculator but by now sort of used to then look for ÷, but it does not come natural to me.

(意訳)

/ が一番使われてるんじゃないかな。

公立学校では ÷ じゃなくて : を使っていたと思う。100% かどうかはわからないけど。

ぼくは、いつも計算器を使うときに / ボタンがなくて、ちょっと反応が遅れるんだ。いまでは、その次に ÷ ボタンを探すようになったけどね。だけど、しっくりこないんだよなぁ。

2009.4.23

iPhone 開発に使える C99 仕様と gcc 拡張

iPhone アプリの開発には、コンパイラとして gcc 以外を使うことは基本的にありません。

したがって、gcc に実装されている C99 仕様や gcc 拡張仕様を気がねすることなく利用することができます。

ここでは、便利な C99 仕様や gcc 拡張を紹介します。


配列の動的確保 (C99)

配列を定義するときに、動的にサイズを指定してメモリを確保することができます。

従来は、

int n = 100;
char* buf = alloca(n);

のように alloca を使っていたところを、

int n = 100;
char buf[n];

と、言語仕様の範囲内で、より直観的に書けるようになりました。


case の範囲指定 (gcc 拡張)

従来、switch 〜 case で

switch (n) {
  case 0:
  case 1:
  case 2:
  case 3:
    process(n);
    break;
}

のようにばらばらに書いていた case の部分を、

switch (n) {
  case 0 ... 3:
    process(n);
    break;
}

と、まとめて書けるようになりました。

値と「...」の間にスペースが必要なことに注意してください。

文字列処理でも、

switch (c) {
  case 'a' ... 'z':
  case 'A' ... 'Z':
    process(c);
    break;
}

のように、この構文を使うことができます。

このように、いままでは範囲指定したいがために switch を使うのをあきらめて if にばらしていたケースでも、switch を使えるようになりました。


3項演算子を2項だけで使う (gcc 拡張)

これは、以前書いたネタ ですが、3項演算子を LL 系言語の「||」と同じように使えるという gcc 拡張です。

具体的には、

x ? x : y

と書いていた部分を、

x ?: y

と書くことができます。

つまり、ruby

v = x || y || z

と書くのと同じことを、C でも

v = x ?: y ?: z;

と書けばできるということです。


__func__ (C99)

__func__ (あるいは __PRETTY_FUNCTION__) で、現在実行している関数名を参照することができます。

void c_func()
{
  NSLog(@"%s", __func__);
}

- (void)applicationWillFinishLaunching:(NSNotification*)note
{
  c_func();
  NSLog(@"%s", __func__);
}

のように、C 関数と Objective-C のメソッド内で __func__ を参照すると、

c_func
-[AppController applicationWillFinishLaunching:]

というように、実行中の関数名やメソッド名を取得できていることがわかります。

主にデバッグ時に有用だと思います。


参考

他にも使えそうな仕様がいろいろあるので、一度仕様に当たっておくことをオススメします。

2009.4.18

LimeChat for iPhone 1.7 リリース

http://limechat.net/iphone/ja.html

1.6 で入ってしまっていた、トークを開始したときに落ちるバグを修正しました。

2009.4.9

LimeChat for iPhone 1.6 リリース

http://limechat.net/iphone/ja.html

最新の iPhone OS でのみ出るバグを修正しました。

2009.4.8

Ruby on OS X で話します

5月にオランダのアムステルダムで開かれる Ruby on OS X というイベントで、LimeChat for OSX について話すことになりました。

http://rubyonosx.com/

RubyCocoaMacRuby に興味がある方は、ぜひご参加ください。

Connection: close