TMK

WindowsMobile5は言うこと聞かないね

目次

Blog 利用状況

ニュース

参加コミュニティ

書庫

日記カテゴリ

[C] びっくりー

たった今見たソース。

time_t now = time( &now );

タマゴが先か、ニワトリが先か・・・

これを通すコンパイラにびっくり。
認められているのですか?教えてエロい人

# VC8ではtime(NULL)と等価でした
# でも気持ち悪い。おえー

投稿日時 : 2007年11月28日 20:14

コメントを追加

# re: [C] びっくりー 2007/11/28 21:26 επιστημη

どれどれ...

int main() {
void* p = &p;
}

ほほー。

void* p;
p = &p;

と解釈されてるとすればアリですわねぇ。

# re: [C] びっくりー 2007/11/28 21:55 アクア

> 教えてエロい人

華麗にスルゥゥゥゥ~~~~www


あ、επιστημη さんナイスキャッチ♪

# re: [C] びっくりー 2007/11/29 10:59 ひろえむ

んー、そんなに気持ち悪いかしらん?(^^;

構文解析のアルゴリズムとポインタの仕組みが想像できればさほど気持ち悪くならなくなりますよ(^^;

ポインタって体にしみこむまでは確かに気持ち悪いからねー(^^;

# re: [C] びっくりー 2007/11/29 10:59 ひろえむ

んー、そんなに気持ち悪いかしらん?(^^;

構文解析のアルゴリズムとポインタの仕組みが想像できればさほど気持ち悪くならなくなりますよ(^^;

ポインタって体にしみこむまでは確かに気持ち悪いからねー(^^;

# re: [C] びっくりー 2007/11/29 15:24 ddnp

>えぴさん
void* p;
p = &p;
2行目、厳密にいうと型が違うと思いますが(pVoid = &pVoid)
コンパイラの中の人がそう解釈してるならいいんです。

しかし2つの書き方は、本来別々の仕事をするはず。
あくまでPODに限り、かなあ。

>アクアさん
あ、獲ろい人だw
いや、教えてくれないから得ろ区内人だw

>ひろえむさん
いあ、論理的におかしいからきぼぢばるいと言ってるんです。

コンパイル時に time() の戻りの型を得ますよね。
同時に引数の型(&now)も評価されるはずですが、
このときにはnowが存在しない(はず)と言ってるんす。
#通常通り右辺を先に見るならば。

あくまで受け皿としてのtime_t now; であるので
これはどっちが先だろうかと。

だからepiさんの仮定どおり、特別に分けて解釈されるとしたら納得でごんす。

コンパイラの仕事だから、、、
このような文の結果は処理系依存だとおもう。に1票。

# re: [C] びっくりー 2007/11/29 16:14 とっちゃん

void* p;
p = &p;
は、左辺が void* への代入というのが落とし穴ですね。

かなりはまりやすいところの一つです。ええ、何度もそれで煮え湯を...orz

C/C++ では(Cでも同じなのでw)、void* は、代入したいものがポインタ型であれば、どんなものでも代入できるようになっています。
ポインタ型というよりは、純粋アドレス型といってもいいくらいのものです。
#実際アドレス情報しか持ち得ないですしねw

この場合、void** は、「void* 型のポインタ」なので、代入には何の支障もないということになります。
#一種のアッパーキャストではあるものの、知らずにはまることが意外と多いので注意が必要<warningも出ません

time() のほうは...書いてたらえらい長文になってしまったので、エントリーにしますw

# re: [C] びっくりー 2007/11/29 17:13 ddnp

>void* p;
>p = &p;
>は、左辺が void* への代入というのが落とし穴ですね。

ああーそか。そうですね。
うっかりしていました。だめだ、旅に出ます ...

# =演算子はどう解釈される? 2007/11/29 19:27 とっちゃん's Blog

=演算子はどう解釈される?

タイトル
名前
URL
コメント