タグ付けされた質問 「c」

Cは、オペレーティングシステム、ゲーム、その他の高性能作業に使用される汎用のコンピュータープログラミング言語です。

8
x = x ++が未定義なのはなぜですか?
xシーケンスポイント間で2回変更されるため、未定義です。標準では、定義されていないため、定義されていません。 それだけ知っています。 しかし、なぜ? 私の理解では、これを禁止することで、コンパイラーの最適化が向上します。Cが発明されたとき、これは理にかなっていたかもしれませんが、今は弱い議論のように思えます。 今日Cを再発明する場合、この方法でそれを行うのでしょうか、それとももっと良くすることができますか? または、より深い問題があり、そのような式に一貫したルールを定義するのが難しくなるので、それらを禁止するのが最善ですか? したがって、今日Cを再発明するとします。のような式の単純なルールを提案したいのx=x++ですが、これは既存のルールよりもうまく機能しているように思えます。 提案されたルールを既存のルールと比較したり、他の提案について意見を聞きたいと思います。 推奨ルール: シーケンスポイント間では、評価の順序は指定されていません。 副作用はすぐに起こります。 関連する未定義の動作はありません。式はこの値またはそれを評価しますが、確かにハードディスクをフォーマットしません(奇妙なことに、x=x++ハードディスクをフォーマットする実装を見たことはありません)。 式の例 x=x++-明確に定義され、変更されませんx。 最初に、x(x++評価されるとすぐに)インクリメントされ、次に古い値がに保存されxます。 x++ + ++x-2 x回インクリメントし、評価され2*x+2ます。 どちらかの側が最初に評価されますが、結果はx + (x+2)(左側が最初)または(x+1) + (x+1)(右側が最初)です。 x = x + (x=3)-指定なし、またはにx設定。 右側が最初に評価される場合、それはです。最初に評価される可能性もあるため、です。どちらの場合でも、評価は評価されるとすぐに行われるため、保存されている値は他の割り当てによって上書きされます。x+36x+3x=33+3x=3x=3 x+=(x=3)-明確に定義され、x6 に設定されます。 これは、上記の表現の単なる省略形であると言えます。 ただし、2つの部分(読み取り、評価、追加、新しい値の保存)ではなく、の+=後x=3に実行する必要があります。xx=3 利点は何ですか? いくつかのコメントはこの良い点を提起しました。 私は確かに、そのような表現x=x++は通常のコードで使用されるべきだとは思いません。 実は、私ははるかに厳しいものよりだ-私はのための唯一の良い使い方を考えるx++ようでx++;一人で。 ただし、言語のルールはできるだけシンプルでなければなりません。それ以外の場合、プログラマーはそれらを理解しません。シーケンスポイント間で変数を2回変更することを禁止する規則は、ほとんどのプログラマーが理解していない規則です。 非常に基本的なルールは次のとおり です。Aが有効で、Bが有効であり、それらが有効な方法で結合されている場合、結果は有効です。 xは有効なL値でx++あり、有効な式であり=、L値と式を組み合わせる有効な方法x=x++です。 C標準はここで例外を作成し、この例外はルールを複雑にします。stackoverflow.comを検索して、この例外がユーザーをどれほど混乱させるかを確認できます。 だから私は言う-この混乱を取り除く。 ===回答の要約=== どうしてですか? 上記のセクションで説明しようとしました-Cルールをシンプルにしたいのです。 最適化の可能性: これはコンパイラーからある程度の自由を奪いますが、それが重要であると私に納得させるものは見ませんでした。 ほとんどの最適化は引き続き実行できます。たとえばa=3;b=5;、標準で順序が指定されていても、並べ替えることができます。などの式もa=b[i++]同様に最適化できます。 …

6
より良い構文で、Cにトランスパイルする言語はありますか?[閉まっている]
現在のところ、この質問はQ&A形式には適していません。回答は、事実、参考文献、または専門知識によってサポートされると予想されますが、この質問は、議論、議論、世論調査、または広範な議論を求める可能性があります。この質問を改善し、場合によっては再開できると思われる場合は、ヘルプセンターをご覧ください。 6年前に閉鎖されました。 CoffeeScriptは、Rubyに触発された、きれいな構文でJavaScriptに変換する言語です。Cにトランスパイルして、パフォーマンスを犠牲にすることなく、より読みやすいコードを可能にする同様の言語はありますか?そのようなものが存在しない場合、それを作成しない正当な理由はありますか?
19 c  syntax  compiler 

6
C ++コードでC式を使用するのは良い習慣ですか?
学校では、クラスをはるかに凌いでいるという事実にもかかわらず、今年Cを学び始めました。クラスがCの基礎にある間にJava、C ++、Cを学びました。 Cを学ぶべき理由を先生に尋ねましたが、彼女はそれがC ++の基礎であると言いました。プログラミングを始めたとき、C ++の方が簡単であることがわかりました。後でCを習得しました。 私の質問は非常に簡単です〜C ++でC式を使用するのは良い習慣ですか?例を挙げましょう。 このコードは #include <stdio.h> #include <iostream> int main() { int x; scanf("%d", &x); cout << "The number you entered is " << x << "And it's double is " << x*x; return 0; } これよりも効率的またはより良い方法で: #include <iostream> int main() { int x; cin >> …
19 c++  c 

7
Cプログラムのオブジェクト指向ベストプラクティス[終了]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 4年前に閉鎖されました。 「オブジェクト指向の砂糖が本当に必要な場合は、C ++を使用してください」 -これを聞いたとき、友人の1人からすぐに返事をもらいました。ここでは2つのことが間違っていることを知っています。最初のOOは「砂糖」ではありません。2番目に、C ++はCを吸収していません。 サーバーをC(Pythonのフロントエンド)で記述する必要があるため、大規模なCプログラムを管理するためのより良い方法を模索しています。 オブジェクトの観点から大規模なシステムをモデリングし、オブジェクトの相互作用により、システムの管理、保守、拡張がより容易になります。しかし、このモデルをオブジェクト(およびそのすべて)を持たないCに変換しようとすると、いくつかの重要な決定に挑戦することになります。 システムに必要なオブジェクト指向の抽象化を提供するカスタムライブラリを作成しますか?オブジェクト、カプセル化、継承、ポリモーフィズム、例外、pub / sub(イベント/シグナル)、名前空間、イントロスペクションなど(GObjectやCOSなど)。 または、基本的なC構造(structおよび関数)を使用して、すべてのオブジェクトクラス(およびその他の抽象化)をアドホックな方法で近似します。(たとえば、SOに関するこの質問に対する回答の一部) 最初のアプローチは、モデル全体をCで実装するための構造化された方法を提供しますが、維持する必要がある複雑さの層も追加します。(複雑さは、最初にオブジェクトを使用することで軽減したかったことを思い出してください)。 2番目のアプローチについては知りません。また、あなたが必要とする可能性のあるすべての抽象化を近似するのにどれほど効果的かはわかりません。 したがって、私の簡単な質問は次のとおりです。Cでオブジェクト指向設計を実現するためのベストプラクティスは何ですか。それを行う方法を求めているのではないことに注意してください。これとこの質問はそれについて話す、とさえあります本は、この上。私がもっと興味を持っているのは、これを解決するときに現れる実際の問題に対処する現実的なアドバイス/例です。 注:C ++を支持してCを使用すべきではない理由をアドバイスしないでください。私たちはその段階を十分に過ぎました。

6
2011年のCプログラミング[終了]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 6年前に閉鎖されました。 ロックされています。この質問とその回答はロックされています。なぜなら、質問はトピックから外れていますが、歴史的に重要だからです。現在、新しい回答やインタラクションを受け入れていません。 何ヶ月も前に、私は主に幅広いOS(Linux、* BSD、HPUX、VMSなど)をサポートするPOP3サーバーを維持しながら、生活のためにCコードをカットしました。 私はCのスキルからさびを取り除き、Cで簡単なFORTHをコーディングすることで言語実装について少し学ぶつもりです。 しかし、2000年以降、Cの世界で物事がどのように変化したのか(またはそうでないのか)疑問に思っています。 comp.lang.c 可能な限りANSI C(ただし、C99としてのC89はそれほど広くサポートされていません) gcc -Wall -ansi -pedantic 静的解析ツールの代わりに Emacs Ctags Autoconf + make(およびVMS、HP-UXなどの良さについてはポイント2を参照) 過去11年間Cで書いている人なら誰でも(もしあれば;-))何が変わったのか教えてもらえますか? (他のニュース、聖なるがらくた、私はこれを10年以上行ってきました)。

4
C / C ++の関数呼び出しのスタックフレームを理解していますか?
スタックフレームがどのように構築され、どの変数(パラメーター)がどの順序でスタックにプッシュされるかを理解しようとしていますか?一部の検索結果は、C / C ++コンパイラが関数内で実行された操作に基づいて決定することを示しました。たとえば、関数が渡されたint値を1だけインクリメントし(++演算子に類似)、それを返すことになっている場合、関数のすべてのパラメーターとローカル変数をレジスターに入れます。 どのレジスタが戻り値または値渡しパラメータに使用されるのか疑問に思っています。参照はどのように返されますか?コンパイラーはeax、ebx、ecx、edxをどのように選択しますか? 関数呼び出し中にレジスター、スタック、およびヒープ参照がどのように使用、構築、および破棄されるかを理解するには、何を知る必要がありますか?
19 c++  c  compiler  stack 

8
最初のエラーの後、CまたはC ++のコンパイルエラーを読みますか?
CおよびC ++コンパイラがエラーから回復して解析を続行しようとする理由を理解できませんでした。ほとんどの場合、最初のエラーは偽のエラーのストリームを生成し、最初のエラーが修正されるとすぐに消えます。数年の経験の後、私はすべてのファイルの最初のエラー以外のエラーを見ることを止めました。コンパイラを再実行し、エラーがなくなるまでもう一度実行します。それは一般的な習慣ですか?


7
.cppファイルのみを含めるとすべてが機能するのに、なぜ.hを含める必要があるのですか?
ファイルを含めるだけで機能させることができるのに、なぜファイル.hと.cppファイルの両方を含める必要があるの.cppですか? 例:file.h包含宣言を作成し、次にfile.cpp包含定義を作成し、両方を包含しmain.cppます。 または、file.cppを含む包含宣言/定義(プロトタイプなし)を作成しmain.cppます。 両方とも私のために働く。違いがわかりません。コンパイルとリンクのプロセスに関する何らかの洞察が役立つかもしれません。
18 c++  c  headers  linking  include 

2
Cが人気のTIOBEインデックスでそれほど高いのに、なぜC ++もすぐ下にあるのに、それほど人気が​​ないのですか?[閉まっている]
現在のところ、この質問はQ&A形式には適していません。回答は、事実、参考文献、または専門知識によってサポートされると予想されますが、この質問は、議論、議論、世論調査、または広範な議論を求める可能性があります。この質問を改善し、おそらく再開できると思われる場合は、ヘルプセンターをご覧ください。 6年前に閉鎖されました。 これを回避することはできません。Cがそれほど使用されているが、CはC ++ではない場合、CをC ++よりも使用する最も重要な理由を誰かが説明できますか?このCコードはすべてどこで書かれていますか? これは、命令型プログラミングに大きく依存しているが、C ++コンパイラの実装または調整のコストをサポートできない産業部門に関するものですか?多くのカーネルハッカーがいますか? チオベは関連していますか?私は決して記事につまずかず、単一のTiobeのランキングがどのようになっているのか、業界の本当のニーズを特定するために、業界が好きなものについて実際に何を言っているのか、業界が実際に何を使用しているのかをコメントしたり説明したりしませんでした。説明するのは難しいです。 多くの企業が、C / C ++の仕事がくだらないとしても、CまたはC ++の仕事ではなく、C#、PHP、Javaの仕事を望んでいるのは奇妙だと思います(失業とインタビューをここで関連付けているだけです)。代わりにそれらを取るでしょう。または、これは言語の誇大宣伝がここで強力な役割を果たすことを意味しますか?

8
CでNULLのポインタをいつチェックする必要がありますか?
まとめ: Cの関数は、NULLポインターを間接参照していないことを常に確認する必要がありますか?そうでない場合、これらのチェックをスキップするのが適切ですか? 詳細: プログラミングのインタビューに関する本をいくつか読んでいますが、Cの関数引数の入力検証の適切な程度はどうなっているのでしょうか?明らかに、ユーザーから入力を受け取る関数は、NULL参照を解除する前にポインターをチェックするなど、検証を実行する必要があります。しかし、APIを介して公開することを期待しない同じファイル内の関数の場合はどうでしょうか? たとえば、gitのソースコードには次のように表示されます。 static unsigned short graph_get_current_column_color(const struct git_graph *graph) { if (!want_color(graph->revs->diffopt.use_color)) return column_colors_max; return graph->default_column_color; } 場合*graphであるNULLヌル・ポインタは、おそらくプログラムをクラッシュが、おそらく他のいくつかの予期しない動作が得られ、逆参照されます。一方、関数はstaticそうなので、プログラマーはすでに入力を検証しているかもしれません。Cで書かれたアプリケーションプログラムの短い例であるため、ランダムに選択しただけです。NULLをチェックせずにポインターが使用される場所は他にもたくさんあります。私の質問は、一般にこのコードセグメントに固有のものではありません。 例外処理の文脈の中で同様の質問があるのを見ました。ただし、CやC ++などの安全でない言語では、未処理の例外の自動エラー伝播はありません。 一方、オープンソースプロジェクト(上記の例など)では、使用する前にポインターのチェックを行わないコードがたくさん見られました。関数にチェックを入れるタイミングと、関数が正しい引数で呼び出されたと仮定するタイミングに関するガイドラインについて誰かが考えているかどうか疑問に思っています。 私は本番コードを書くためにこの質問全般に興味があります。しかし、私はプログラミングインタビューのコンテキストにも興味があります。たとえば、多くのアルゴリズムの教科書(CLRなど)は、エラーチェックなしで擬似コードでアルゴリズムを提示する傾向があります。ただし、これはアルゴリズムの中核を理解するのには適していますが、明らかにプログラミングの実践としては適切ではありません。そのため、(教科書のように)コード例を単純化するためにエラーチェックをスキップしていることをインタビュアーに伝えたくありません。しかし、私はまた、過度のエラーチェックを伴う非効率なコードを生成するようには見えません。たとえば、null graph_get_current_column_colorをチェックするように変更された可能性があり*graphますが、*graphnullである場合の動作は明確ではありません。
18 c  validation  null 

8
CとC ++の間に言語はありますか?
私はCのシンプルで透明な性質が本当に好きです。Cコードを書くとき、「漏れやすい抽象化」に邪魔されずに、ほとんど常に、作成しているアセンブリに関して巧妙な推測をすることができます。また、Cのシンプルで使い慣れた構文も気に入っています。 ただし、Cにはクラス、簡素化された非cstring処理などのようなC ++が提供するこれらの単純で有用なdoodadがありません。ジャンプテーブルなどを使用してCで実装することはすべて可能ですが、さまざまな理由でタイプセーフではありません。 しかし、私はC ++のオブジェクトを過度に強調することを好むわけではありません。また、「新しい」演算子などに照れ気味です。C ++には、たとえば、システムプログラミング言語として使用するには、ちょっとした問題がいくつかあるようです。 ウィジェットとdoodadsの規模でCとC ++の間に位置する言語はありますか? 免責事項:これは純粋に事実に基づく質問です。C {、++}は私が計画していることを何でもするのに十分であるというあなたの見解を共有しないので、私はあなたを怒らせるつもりはありません。
18 c++  c 

3
左から右への言語構文の利点
私はChannel9 でハーブサッターとのインタビューを見ていましたが、彼はビデオの最後で、左から右への言語構文が将来のC ++標準のウィッシュリストの一番上にあると述べました(彼はそのようにC ++を変更することを認めていますがまったく別の獣になります)。 の他に: 人間がより理解しやすく、肉眼で明確 //C syntax /*pointer to function taking a pointer to function(which takes 2 integers as arguments and returns an int), and an int as arguments and returning an int*/ int (*fp)(int (*ff)(int x, int y), int b) //Go analogous syntax which is left to write …

5
独自のカーネルの構築に関する野心的な学生へのアドバイス[非公開]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 5年前に閉鎖されました。 私は非常に野心的な大学生で、コンピューターについて知っておくべきことをほとんどすべて学びたいと思っています(必要に応じて、私は学習が大好きです)。最近、私は自分のカーネルを設計して構築するのは楽しいプロジェクトになるだろうと考えました(長いプロジェクトですが)。 基本的な情報を入手しましたが、実際に機能させるにはAssemblyとC / C ++をマスターする必要があることを知りました。私はそれらに取り組んでいますが、プログラミングの観点からカーネルが実際にどのように機能するかを学びたいです。私はLinuxカーネルのコードを閲覧するのに何時間も費やしましたが、それだけであなたを連れて行くことができます。 カーネルを構築する基本的な手順は何ですか?対処する必要があるもの 注文するのですか?私は多くのことを噛んでいることを知っていますが、私はそれを処理するのに十分決心しています。
18 c  assembly  kernel 

15
高級言語でプロトタイプを作成することは一般的ですか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 6年前に閉鎖されました。 私は現在、(C)で実際の経験がほとんどない言語での現在のプログラミング能力をはるかに超えるプロジェクトに着手するというアイデアをいじっています。全体的な設計を進めるために、私がよく知っている(Perl / Python / Ruby / C#のような)高級言語でプロトタイプを作成することは価値があるでしょうか? 最終的に、最終製品はパフォーマンスに敏感であるため(データベースエンジンです)、Cを選択しますが、Cをよく知らないと木のために森を失うことになるのではないかと思います。 同様の質問を探しているうちに、プログラマーがPrologでプロトタイプを作成し、それをアセンブラーで試していたという1人の仲間がいることに気付きました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.