いつものように twitter を眺めていたら、sizeof(a++) という摩訶不思議な式が。

いやまあ、sizeof の中に型名だけでなく変数名や構造体のメンバ名も書けることは知っているわけです。たとえば以下のように。

D:\>type a.c
#include 

struct hoge {
        int foo;
        char bar;
};

int main(void)
{
        struct hoge a;
        printf("%d\n%d\n%d\n",
            sizeof(struct hoge),
            sizeof(a),
            sizeof(a.foo));
        return 0;
}
D:\>a.exe
8
4
4
D:\>

で、sizeof が引数として取るのは「型名」または「式」なので、式ならば副作用の有無にかかわらず書けてしまうわけです。

D:\>type b.c
#include 

int main(void)
{
        int a = 1;
        printf("%d\n", a);
        printf("%d\n", sizeof(a++));
        printf("%d\n", a);
        return 0;
}
D:\>b.exe
1
4
1
D:\>

実際に試してみると、上のように式が表す副作用は発生しません。単に式が表すモノのサイズだけを計算するようです。

だからどうした、って話ですけど。

Trackback

no comment untill now

Add your comment now