みけCATのにっき(仮)
つれづれなるまゝに、日くらし、PCにむかひて、心に移りゆくよしなし事を、そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。
(本当か!?)
出典

嘘だっ!

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

嘘だっ!

投稿記事 by みけCAT » 14年前

世の中のC言語を扱ったサイトの中には、嘘が書いてあることがあります。
(C言語を扱ったサイトに限らないだろうけど)
まずは「苦しんで覚えるC言語」から
http://9cguide.appspot.com/04-02.html
念のため魚拓をとっておきました
苦C さんが書きました:C言語では、計算するには数式を記述するだけで済みます。
次のプログラムは、100+200 の計算をコンピュータにやらせる例です。

CODE:

int main(void)
{
	100+200;
}
このプログラムの実行結果は、次の通りになります。

CODE:

画面には、何の結果も表示されていません。
これは当然で、先ほどのプログラムは、100+200 を計算しろとしか書かれておらず、
計算した結果を表示しろ、とは一切書かれていないからです。
これは嘘です。
もしこれが本当なら、たとえば1/0と書いておくと、1/0を計算し、ゼロ除算で落ちるはずです。
実際にやってみましょう。
http://codepad.org/6mLIyqrs
このように、1/0と書いても何も起こりません。
これは、計算をしていない証拠です。
対照実験を行ってみましょう。printfの引数に入れてみます。
http://codepad.org/LKm4gMGO
このように、きちんとエラーが表示されます。
Windows上(gcc3.4.2)でもやってみました。

CODE:

int main(void)
{
	1/0;
}
と書いても何も起こらないのに対し、

CODE:

#include 

int main(void) {
	printf("%d\n",1/0);
	return 0;
}
と書くと強制終了されます。
[hr]
次に、ニコニコ大百科の「C言語」のページ
http://dic.nicovideo.jp/a/c%E8%A8%80%E8%AA%9E
念のため魚拓をとっておきました
また、return せずに main 関数の最後まで到達した場合、main 関数は 0 を返したことになる。
これは嘘です。
実際にやってみましょう。
http://codepad.org/2RvvBHYJ
http://ideone.com/RLzjY
この二つのページを見ると、いずれも13が返されたことになっています。
よって、0を返したことになるというのは嘘です。

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前

Re: 嘘だっ!

投稿記事 by h2so5 » 14年前

1 / 0; がエラーになるかどうかは処理系依存ではないですか?

VC++ではビルドエラーになります。
ただ、計算しかしていない式であれば、どちらにしろ最適化の時に無視されると思いますが。

追記:
VC++でもReleaseモードだとエラーは出ないようです。
最後に編集したユーザー h2so5 on 2011年1月01日(土) 12:45 [ 編集 1 回目 ]

アバター
Justy
副管理人
記事: 122
登録日時: 15年前

RE: 嘘だっ!

投稿記事 by Justy » 14年前

 嘘というか単純な記述ミスが大半だとは思いますが。
みけCAT さんが書きました:100+200 の計算をコンピュータにやらせる例です
 厳密にとらえればたしかにそう思えなくもないですが、それほど間違っていないと思いますよ。
 そのプログラムは「やらせる例」であり「100+200 を計算しろ」と書いてあるプログラムなわけですがが
やらせようとした結果コンピュータ(コンパイラ)は指示を無視しただけなので。

みけCAT さんが書きました:return せずに main 関数の最後まで到達した場合、main 関数は 0 を返したことになる
 こちらに関しては検証方法に問題があります。
 この話は C99とC++98以降の話なので、当然規格に準拠していない古いコンパイラは対応していないことがあります。

http://ideone.com/9KWAn
http://ideone.com/HXejU

ISLe
記事: 2650
登録日時: 15年前

Re: 嘘だっ!

投稿記事 by ISLe » 14年前

そんな些細なことより明らかな間違いがたくさんありますよ。
最後に編集したユーザー ISLe on 2011年1月01日(土) 21:48 [ 編集 1 回目 ]