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

Cは、システムプログラミング(OSおよび組み込み)、ライブラリ、ゲーム、クロスプラットフォームに使用される汎用プログラミング言語です。このタグは、ISO 9899標準で定義されているC言語に関する一般的な質問で使用する必要があります(特に指定のない限り、最新バージョン9899:2018。バージョン固有のリクエストには、c89、c99、c11などのタグも付けます)。CはC ++とは異なり、合理的な理由がない限り、C ++タグと組み合わせるべきではありません。

10
なぜprintf(“%f”、0); 未定義の動作を与える?
ステートメント printf("%f\n",0.0f); 0を出力します。 ただし、ステートメント printf("%f\n",0); ランダムな値を出力します。 ある種の未定義の動作を示していることに気づきましたが、具体的にその理由を理解できません。 全てのビットが0である、浮動小数点の値がまだ有効であるfloat0の値を持つ floatとint(つまりも関連している場合)、私のマシン上で同じサイズです。 なぜ浮動小数点リテラルの代わりに整数リテラルを使用すると、printfこの動作が発生するのですか? PS私が使用した場合と同じ動作が見られます int i = 0; printf("%f\n", i);

19
列挙型の変数をCの文字列として使用する簡単な方法は?
これが私がやろうとしていることです: typedef enum { ONE, TWO, THREE } Numbers; 次のようなスイッチケースを実行する関数を記述しようとしています。 char num_str[10]; int process_numbers_str(Numbers num) { switch(num) { case ONE: case TWO: case THREE: { strcpy(num_str, num); //some way to get the symbolic constant name in here? } break; default: return 0; //no match return 1; } すべてのケースで定義する代わりに、上記のように列挙型変数を使用して設定する方法はありますか?


13
##プリプロセッサオペレーターと考慮すべき問題のアプリケーションは何ですか?
以前の質問の多くで述べたように、私はK&Rを通じて作業しており、現在プリプロセッサーに取り組んでいます。さらに興味深いことの1つは、これまでCを学ぼうとした試みのどれからもこれまで私が知らなかったものですが、##プリプロセッサーオペレーターです。K&Rによると: プリプロセッサー演算子## は、マクロ展開中に実際の引数を連結する方法を提供します。置換テキストのパラメーターがに隣接している##場合、パラメーターは実際の引数に置き換えられ、 ##および周囲の空白が削除され、結果が再スキャンされます。たとえば、マクロpaste は2つの引数を連結します。 #define paste(front, back) front ## back そのpaste(name, 1)トークンを作成します name1。 現実世界でこれをどのように、そしてなぜ使用するのでしょうか?その実際の使用例は何ですか?考慮すべき落とし穴はありますか?

12
TCHARはまだ関連していますか?
私はWindowsプログラミングに不慣れで、Petzoldの本を読んだ後、次のように思います。 文字列を宣言するためにTCHAR型と_T()関数を使用することはまだ良い習慣ですか、それとも新しいコードでwchar_tとL""文字列を使用する必要があるのですか? Windows 2000以降のみを対象とし、コードは最初からi18nになります。
87 c++  c  windows  unicode  wchar-t 


7
C / C ++:ビットフィールドの順序と配置を強制する
構造体内のビットフィールドの順序はプラットフォーム固有であると読みました。異なるコンパイラ固有のパッキングオプションを使用した場合、データが書き込まれるときに正しい順序で保存されることが保証されますか?例えば: struct Message { unsigned int version : 3; unsigned int type : 1; unsigned int id : 5; unsigned int data : 6; } __attribute__ ((__packed__)); GCCコンパイラを搭載したIntelプロセッサでは、フィールドは示されているようにメモリに配置されていました。Message.versionバッファの最初の3ビットであり、Message.typeその後に続きます。さまざまなコンパイラで同等の構造パッキングオプションを見つけた場合、これはクロスプラットフォームになりますか?

15
fork()の目的は何ですか?
Linuxの多くのプログラムやマニュアルページで、を使用しfork()たコードを見てきました。なぜ使用する必要fork()があり、その目的は何ですか?
87 c  unix  posix  fork 


12
C列挙型の値の代わりにテキストを出力する
int main() { enum Days{Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday}; Days TheDay; int j = 0; printf("Please enter the day of the week (0 to 6)\n"); scanf("%d",&j); TheDay = Days(j); //how to PRINT THE VALUES stored in TheDay printf("%s",TheDay); // isnt working return 0; }
87 c  enums 


4
scanf()は、改行文字をバッファに残します
私は次のプログラムを持っています: int main(int argc, char *argv[]) { int a, b; char c1, c2; printf("Enter something: "); scanf("%d",&a); // line 1 printf("Enter other something: "); scanf("%d", &b); // line 2 printf("Enter a char: "); scanf("%c",&c1); // line 3 printf("Enter another char: "); scanf("%c", &c2); // line 4 printf("Done"); // line 5 …
87 c  scanf 

5
CおよびC ++が構造体内の配列のメンバーごとの割り当てをサポートしているのに、一般的にはサポートしていないのはなぜですか?
配列のメンバーごとの割り当てがサポートされていないため、以下が機能しないことを理解しています。 int num1[3] = {1,2,3}; int num2[3]; num2 = num1; // "error: invalid array assignment" 私はこれを事実として受け入れ、言語の目的はオープンエンドのフレームワークを提供することであり、配列のコピーなどの実装方法をユーザーに決定させることであると考えました。 ただし、以下は機能します。 struct myStruct { int num[3]; }; struct myStruct struct1 = {{1,2,3}}; struct myStruct struct2; struct2 = struct1; 配列num[3]は、のインスタンスからのインスタンスにメンバーごとに割り当てられstruct1ますstruct2。 配列のメンバーごとの割り当てが構造体でサポートされているのに、一般的にはサポートされていないのはなぜですか? 編集:ロジャーパテのスレッドにコメントのstd ::構造体の文字列-コピー/割り当ての問題?答えの一般的な方向を指しているようですが、私はそれを自分で確認するのに十分なことを知りません。 編集2:多くの優れた応答。行動の背後にある哲学的または歴史的根拠についてほとんど疑問に思っていたので、ルーサー・ブリセットを選びましたが、関連する仕様書へのジェームズ・マクネリスの参照も役に立ちました。

6
ファイルスコープで可変的に変更された配列
「.m」ファイルの最上位にある次のようなものに似た、Objective-C実装ファイル全体で使用される定数静的配列を作成したいと思います。 static const int NUM_TYPES = 4; static int types[NUM_TYPES] = { 1, 2, 3, 4 }; NUM_TYPES後でファイルで使用する予定なので、変数に入れたいと思いました。 ただし、これを行うと、エラーが発生します 「ファイルスコープでさまざまに変更された「タイプ」」 これは、配列サイズが変数であることに関係している可能性があることを私は収集します(のように、整数リテラルをそこに置いても、このメッセージは表示されませんstatic int types[4])。 私はこれを修正したいのですが、多分私はそれをすべて間違って行っています...私はここに2つの目標があります: ファイル全体からアクセスできる配列を作成する NUM_TYPESファイル内のさまざまな場所に同じリテラルが散在しないように、変数にカプセル化する 助言がありますか? [編集]これはCのFAQで見つかりました:http://c-faq.com/ansi/constasconst.html

12
ループのどの時点で整数オーバーフローは未定義の動作になりますか?
これは、ここに投稿できないはるかに複雑なコードを含む私の質問を説明するための例です。 #include <stdio.h> int main() { int a = 0; for (int i = 0; i < 3; i++) { printf("Hello\n"); a = a + 1000000000; } } このプログラムにはa、3番目のループでオーバーフローするため、プラットフォームでの未定義の動作が含まれています。 それにより、プログラム全体の動作が未定義になりますか、それともオーバーフローが実際に発生したですか?コンパイラは、潜在的にそれが出て仕事ができるa だろう、それは未定義ループ全体を宣言し、彼らはすべてのオーバーフローが起こる前にもかかわらず、printfを実行する気にすることはできませんので、オーバーフロー? (CとC ++のタグは異なりますが、両方の言語が異なる場合は回答に興味があるためです。)

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