ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

CとC++コミュのコンパイラ通るんです

  • mixiチェック
  • このエントリーをはてなブックマークに追加

int b = // ここの値はあとで考えることにしよう

c = 0;
------------------------------------------------
というコードを書いて、後で考えるはずの初期値を
考えるのを忘れたままコンパイルしたら、エラーもなく
コンパイルが完了しました。
(もちろん、期待した結果にはなりませんでしたが)

とか、

if (a =! 0) { .... }

とか書いても、平気でコンパイルを通りました。
これまた、期待したとおりの結果にはなりませんでしたが。

こんな風な、冷静に考えるとちゃんとコンパイラを通るけど、これは、通って欲しくなかったコードありませんか?



コメント(37)

世の中でバグと呼ばれるモノにはそういうのが沢山。
> if (a =! 0) { .... }

ふつうにwarningになりますけどねえ。

warning: suggest parentheses around assignment used as truth value
日本語の読み書きよりC++の読み書きの方が圧倒的に多い生活を10年ほど続けてると
そういうミスはなくなるんだよね。
その上で、変な表記はエディターによって色つき反転表示される工夫を追加。
間違っている箇所がすぐわかるような書き方をするのが正しいのかなあ。
すみません、void な関数が値を返しても、関数の真ん中に単独で、 return があっても、何も言わずにとおしてくれるようなコンパイラ使ってるもんですから。
組み込み用のCコンパイラで。

だったら、よけい、間違いはすぐわかるように書けというのはその通りですはい。

ちなみに、

a << 3;

になっていて、a の値が全然変わらないので、悩んだこともありますです。

> if (a =! 0) { .... }

これはtypoということで、コンパイラやチェックツールなどで検出できた方がいいと思いますが、

> int b = // ここの値はあとで考えることにしよう
>
> c = 0;

こちらはtypoではなく意図してそう書いているので、そもそもの取り組み方を変えるべきかと思います。
なぎです。
なんといいますか、

> int b = // ここの値はあとで考えることにしよう

これも、typo ではあるのです。うっかりコメントにしてしまったという。

int b = ここの値は後で考えることにしよう

というのが意図したものです。
まあ、コメントでも、ちゃんとエラーになってくれるかなと思ったのが浅はかでしたが。

void func(引数は、あさってのミーティングで決定);

while(仕様書3の条件){... }

という感じで、やることやるまでは、コンパイルが絶対通らないようにという意図的なエラーを起こしておけば、やることを忘れたまま、実行できてしまうことはなかろうと。あと、どのモジュールが未定なのか、コンパイラに聞けばわかるし。

こんなことをやっています。

あと、ひとつ大嘘を書いていました。

> void な関数が値を返しても

さすがに、それはエラーだろう。


ターゲット用に組込み用のコンパイラ使えばいいだけで、チェックツールとして gcc を併用すればいいんでは?
lint 使ってもいいし
なぎです。

> lint 使ってもいいし

と、それはもちろんまっとうなご指摘ではあるわけですが。

Cの文法上の特徴から、一見すると、「あれ?」と思うようなコードが、実は文法上は正しかったりするわけで、それは、たとえば、ling の *前* にコンパイラを通したりすることで、実体験となったりするわけです。

というのが、このトピックの趣旨ではあります、はい。

> 10
> lingとは何?

あ〜そのですね……。
lint の間違いです。お恥ずかしい。
gccの様々な警告オプションをつけるとか、lintを通すとか、
そういうのは常にやっておいた方がいいよ。
そういう環境を日常にして慣れておいた方が良い習慣が身につく。
これは、Kusakabe さんのコメントがいただけるなんて……。

わたしも、そういった背景まで走らないのですが、それでも、演算子の前後は必ず空けるような流儀はしみついております。

そういうったこともあったのですね。
あ、そうですね。嘘ついていました。

> ほんと? 単行演算子も? 『.』や『->』も? 『sizeof』も? 『,』も?

sizeof と , (演算子の , も)の後ろは空けますが。
. や -> は空けません、確かに。

さっき、ビルドしてみたけど、上はフツーにエラーになりますよ。

通ったコードのエビデンス載せてや。
ソースを書くときには、普段から慣用句(慣用表現)を身に付けておくと良いです。
そうすれば、何かおかしい点があったら、すぐに気付きます。
慣用句を身に付けておけば、他の人が書いたソースでも、気付きやすいです。

また、コンパイル時には必ずワーニングメッセージが出力されるようにオプションを指定する
習慣をつけると良いです。
> Kusakabeさん

私の言わんとしている意図がいまいち伝わっていないかも知れませんが。

今回の件に限らず、ワーニングメッセージを出力させるようにすることは大事です。
かの偉大なるカーニハン先生も、著書の中でそのように書いています。
ワーニングメッセージを頭ごなしに否定するかのような考え方は良くないです。

それから、Kusakabeさんの、そのような発言の書き方は喧嘩の原因になりかねないので、
気を付けたほうが良いです。
ものすごく遅くなってしまいすみません。

> いいえ。言ってません。
> まったくのデマです。

カーニハン、パイク共著の「プログラミング作法」の P.166 に、ちゃんと書いてあります。
読んでないの?
> 29

文字化けの件は、本件の内容とは無関係です。
つっこんでいる内容が、大きく的外れです!!

素直に自分の詰めが甘い点を認めなさい。
>30
P.166の中のどこに何が書かれていると言いたいの?
昔の話ですけれども BSS を 0 初期化するのが手間がかかるってことで、
やめにしたら多くのプログラムが動かなくなったとか。

Unix 系の多くの実装では 0 初期化されることが前提になっているような気がしますけど。
他は知りません。

まぁ、初期値は与えた方が読みやすいですし、安心ですね。
> エラーですね。空白ぐらいちゃんと書こう。

昨夜1時間以上考えたんですけど、「0」に行くと思ってたました。
空白の方がキレがありますね。やっぱり凄いなあ。
#35

C で EBCDIC なんか使ってはいけないことかも知れません。
でも、記述したとおり BSS でのことですので、
スタック上の変数まで面倒は見てくれません(不定)。

ログインすると、残り12件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

CとC++ 更新情報

CとC++のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング