20

来月システムプログラミングを始める前に、Cの基本と構文を学ぶことを検討しています。読んでいると、C89/99規格に出くわしました。ウィキペディアによると、

C99は、インライン関数、いくつかの新しいデータ型(long long intおよび複合数を表す複合型を含む)、可変長配列、バリアディックマクロ(可変アリティのマクロ)のサポート、および1行のサポートを含むいくつかの新機能を導入しました。 BCPLまたはC++のように、//で始まるコメント。これらの多くは、すでにいくつかのCコンパイラの拡張機能として実装されていました。

C99は、ほとんどの場合C90と下位互換性がありますが、いくつかの点でより厳密です。特に、型指定子がない宣言では、intが暗黙的に想定されなくなりました。標準マクロ STDC_VERSIONは、C99サポートが利用可能であることを示すために値199901Lで定義されていますGCC、Sun Studio、およびその他のコンパイラは、C99の新機能の多くまたはすべてをサポートするようになりました。

K&R、2nd Editionのコピーを借りましたが、C89標準を使用しています。学生の場合、C89を使用すると、K&Rの対象となる一部の科目が無効になりますか?その場合、何に注意する必要がありますか?

4

8 に答える 8

19

C99 よりも C89 や C90 を学ぶ理由はありません。C99 コンパイラを見つけるのは簡単で、以前の標準を学習する理由はまったくありません。

これは、教授が C89 を強制しないという意味ではありません。宿題としてここに投稿されたさまざまな質問から、非常に多くの C (そして残念ながら C++) のコースが C89 以降進んでいないように感じます。

初心者の観点から見ると、実際には違いに気付かない可能性があります。C99 と C89/90 の両方をカバーする C はたくさんあります。

于 2010-12-05T13:35:20.270 に答える
11

C99 標準を使用してください。これはより新しく、より多くの機能を備えています。booltype in<stdbool.h>int32_tetc. 型のファミリが特に便利です。int後者は、特定のサイズを持つ sに依存する多くの移植性のないコードを防ぎます。私の知る限り、K&R が無効になるわけではありませんが、一部のサンプル プログラムは現在、わずかに異なるスタイルで記述されている可能性があります。

一部のコンパイラは、まだ C99 を適切にサポートしていないことに注意してください。GCC-std=c99を有効にするには、フラグを使用する必要があると思います。多くの Unix/Linux システムには、c99GCC をラップして C99 を有効にするコマンドがあります。

同じことが多くの大学教授にも当てはまります。bool私は新入生の時に使っていたプログラムを提出して、私のものを驚かせました。彼は C でその型を聞いたことがありませんでした :)

于 2010-12-05T13:35:46.927 に答える
4

私は一般的に他の人たちに同意しますが、K&R は非常に優れた本であり、そこから C を学び、C99 標準について読んで知識を更新する価値があることに注意してください。

于 2010-12-05T13:38:12.603 に答える
3

あなたが学生レベルであれば、おそらく違いにさえ気付かないでしょう。

于 2010-12-05T13:42:03.573 に答える
2

はい、K&R が優れた C の本であるという大声でのコンセンサスを得て、C99 が C の正しい/現在の/最良のバージョンであるという大声でのコンセンサスを得られるのは少し奇妙です。「C 意味 C99」を学ぶのに利用できる最高の本。

C99 を学習して使用することをお勧めしますが、その際は C89 に注意してください。C89 と C99 の両方の準拠モードを持つコンパイラを使用する場合は、違いを理解するためだけに C89 を少し書くことができます。そうすれば、C99 が対応していない場所に移植できるようにするためのコードを作成する必要が生じた場合、何をすべきかがわかります。そのようなコードをまったく書く必要がなければ、おそらく 1 日を無駄にしていることになります。

C89 標準のコピーを入手するのは難しいため、C89 を適切に記述することは実際には驚くほど困難です。したがって、できればC99、何らかの奇妙な理由で必要な場合はC89で、違いが何であるかをある程度認識してください。K&R を使用して非常に基本的な部分をカバーすることもできますが、慣用的な C99 をできるだけ早く見てください。

K&R を読む際に注意すべき特定の問題については、標準の序文に主要な変更点のリストがあります (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf ) ただし、詳細はそこには記載されていません。それらの多くは C99 に追加された新機能であるため、K&R が間違っているわけではなく、特定のジョブに最適なツールを常に使用するとは限りません。それらのいくつかは、とにかく詳細が必要な場合は、おそらく標準を参照する必要がある非常に扱いにくいものです。残りは C89 から削除されたものであり、通常、C99 コンパイラは、それらを使用しようとすると、それらについて通知します。

于 2010-12-05T16:00:36.923 に答える
1

学生として、それはあなたにそれほど影響を与えません。しかし、可能であれば、C99 をカバーする新しい C の本を見つけてください。

于 2010-12-05T13:37:27.493 に答える
1

どの機能がより最近のもので、あいまいな (または MSVC のように意図的に壊された) コンパイラによってサポートされる可能性が低いかを知ることは有益だと思いますが、絶対に使用すべき C99 機能がいくつかあります。

  • snprintf: これは、C での安全でクリーンな文字列アセンブリの決定的な関数です。コンパイラにこの関数がない場合は、サブシステム全体を置き換えることができます(欠落しているほとんどの実装には、(しばしば意図的な)動作のバグがいっぱいあるprintfため、おそらく良い考えです) )、または/ / /をラップします。snprintfprintftmpfilefprintffreadfclose

  • stdint.h: 固定サイズの型 (16/32/64 ビット) が必要な場合はint16_tuint16_tint32_t、 などの標準名を使用してINT64くださいu32。コードが醜くなり、統合や再利用が難しくなるだけです。コンパイラが見つからない場合はstdint.h、独自のコンパイラをドロップして、プラットフォームに適した型の観点から型を定義してください。

  • 具体的には、 64ビット数値を扱うための、またはその他の恐ろしいレガシーハックの代わりuint64_tに. C99 をサポートしていなくても、正常なコンパイラには、定義に使用できる独自の 64 ビット型があります。int foo[2];struct { int lo, int hi; } foo;int64_tuint64_t

于 2010-12-05T17:09:26.123 に答える
1

「C89」という用語は、2 つの非常に異なる言語を表しています。

  1. 1989 年にプログラマーが標準が曖昧な場所で記述していると委員会が考えていた言語で、既存の実装で一般的な機能をサポートしていました。

  2. それ以来、委員会が記述したいと決定した言語であり、既存の機能との互換性を窓の外に投げ出しました。

C99 は、既存のコードのかなりの部分を破壊し、以前に C で実行されていたのと同じくらい効率的に多くのタスクを実行することを不可能にする方法で標準を解釈することを意図していると言って、標準のあいまいな部分を「明確化」します。 1989年。

多くのアプリケーションのプログラミングに適した言語は、標準化前の C、C89、C99、および C11 のスーパーセットです。ただし、その言語でプログラミングする人は、信頼性よりも速度を優先する縮小サブセットではなく、その言語を使用していることを明確にすることが重要です。

于 2011-03-15T15:23:34.713 に答える