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

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

2
定数0.0039215689は何を表していますか?
この定数がさまざまなグラフィックヘッダーファイルにポップアップ表示され続ける 0.0039215689 色と関係があるようですね。 Googleでの最初のヒットは次のとおりです。 void RDP_G_SETFOGCOLOR(void) { Gfx.FogColor.R = _SHIFTR(w1, 24, 8) * 0.0039215689f; Gfx.FogColor.G = _SHIFTR(w1, 16, 8) * 0.0039215689f; Gfx.FogColor.B = _SHIFTR(w1, 8, 8) * 0.0039215689f; Gfx.FogColor.A = _SHIFTR(w1, 0, 8) * 0.0039215689f; } void RDP_G_SETBLENDCOLOR(void) { Gfx.BlendColor.R = _SHIFTR(w1, 24, 8) * 0.0039215689f; Gfx.BlendColor.G = _SHIFTR(w1, 16, …

13
'sizeof'(配列を指すポインター)を見つける方法は?
まず、ここにいくつかのコードがあります: int main() { int days[] = {1,2,3,4,5}; int *ptr = days; printf("%u\n", sizeof(days)); printf("%u\n", sizeof(ptr)); return 0; } ptr(32ビットシステムでは4バイトであるサイズを指定する代わりに)指している配列のサイズを確認する方法はありますか?
309 c  arrays  pointers  sizeof 

11
NULL、 '\ 0'、0の違いは何ですか?
- Cにおいては、様々なゼロの値の差があるように思われるNULL、NULと0。 ASCII文字'0'が48またはに評価されることを知ってい0x30ます。 NULLポインタは、通常のように定義されます。 #define NULL 0 または #define NULL (void *)0 また、評価しそうNULなキャラもいます。'\0'0 これら3つの値が等しくない場合がありますか? これは64ビットシステムにも当てはまりますか?
309 c  pointers  null 

8
rand()+ rand()が負の数を生成するのはなぜですか?
私はその観察rand()、それがループ内で一度だけ呼ばれるライブラリ関数を、それはほとんど常に正の数を生成します。 for (i = 0; i < 100; i++) { printf("%d\n", rand()); } しかし、2つのrand()呼び出しを追加すると、生成された番号の負の数が増えます。 for (i = 0; i < 100; i++) { printf("%d = %d\n", rand(), (rand() + rand())); } 2番目のケースで負の数が表示される理由を誰かが説明できますか? PS:ループの前にシードをとして初期化しますsrand(time(NULL))。
304 c  random 

20
コンパイラの警告を常に有効にする必要があるのはなぜですか?
CおよびC ++プログラムをコンパイルするとき、「コンパイラの警告を常に有効にする」必要があるとよく耳にします。なぜこれが必要なのですか?それ、どうやったら出来るの? 「警告をエラーとして扱う」べきだとも時々聞いています。したほうがいい?それ、どうやったら出来るの?


5
単一の乗算でビットを抽出する
別の質問への回答で使用されている興味深いテクニックを見て、少しよく理解したいと思います。 符号なし64ビット整数が与えられ、次のビットに関心があります。 1.......2.......3.......4.......5.......6.......7.......8....... 具体的には、次のように上位8つの位置に移動します。 12345678........................................................ で示されるビットの値は.関係ありません。それらを保持する必要はありません。 溶液は、不要なビットをマスクし、によって結果を乗算することでした0x2040810204081。結局のところ、これでうまくいきます。 この方法は一般的ですか?この手法を使用してビットのサブセットを抽出できますか?そうでない場合、方法が特定のビットのセットに対して機能するかどうかをどのようにして理解しますか? 最後に、与えられたビットを抽出するために(a?)正しい乗数をどのように見つけますか?

3
なぜインテル®C ++コンパイラーでNaN-NaN == 0.0なのですか?
NaNが算術で伝播することはよく知られていますが、デモを見つけることができなかったため、簡単なテストを作成しました。 #include <limits> #include <cstdio> int main(int argc, char* argv[]) { float qNaN = std::numeric_limits<float>::quiet_NaN(); float neg = -qNaN; float sub1 = 6.0f - qNaN; float sub2 = qNaN - 6.0f; float sub3 = qNaN - qNaN; float add1 = 6.0f + qNaN; float add2 = qNaN + qNaN; float …
300 c++  c  floating-point  ieee-754  icc 


14
CのMINおよびMAX
どこにMINありMAX、Cで定義されているとすれば、それはすべてですか? これらをできるだけ一般的に入力安全に実装するための最良の方法は何ですか?(主流のコンパイラー向けのコンパイラー拡張/ビルトインが望ましい。)
300 c  max  min  c-preprocessor 

4
C / C ++での文字( 'a')のサイズ
CおよびC ++の文字サイズはどれくらいですか?私が知る限り、charのサイズはCとC ++の両方で1バイトです。 C: #include <stdio.h> int main() { printf("Size of char : %d\n", sizeof(char)); return 0; } C ++の場合: #include <iostream> int main() { std::cout << "Size of char : " << sizeof(char) << "\n"; return 0; } 驚きはありません、どちらも出力を提供します: Size of char : 1 今、私たちは、文字は次のように表現されていることを知っている'a'、'b'、'c'、'|'、...だから、僕はこれらに上記のコードを変更しました: C: #include <stdio.h> int …
298 c++  c  types 

9
Cのポインター:アンパーサンドとアスタリスクを使用する場合
私はポインタから始めたばかりで、少し混乱しています。私が知っているの&は変数のアドレスで*あり、これはポインター変数の前で使用して、ポインターが指すオブジェクトの値を取得できます。しかし、配列、文​​字列を操作しているとき、または変数のポインターコピーを使用して関数を呼び出しているときは、動作が異なります。これらすべての中のロジックのパターンを見るのは難しいです。 ときに私が使用する必要があります&と*?
298 c  pointers 

6
Cでint64_t型を出力する方法
C99標準には、int64_tのようなバイトサイズの整数型があります。次のコードを使用しています。 #include <stdio.h> #include <stdint.h> int64_t my_int = 999999999999999999; printf("This is my_int: %I64d\n", my_int); そして、私はこのコンパイラ警告を受け取ります: warning: format ‘%I64d’ expects type ‘int’, but argument 2 has type ‘int64_t’ 私が試した: printf("This is my_int: %lld\n", my_int); // long long decimal しかし、同じ警告が表示されます。私はこのコンパイラを使用しています: ~/dev/c$ cc -v Using built-in specs. Target: i686-apple-darwin10 Configured with: /var/tmp/gcc/gcc-5664~89/src/configure --disable-checking …
298 c  stdint 

26
経過時間を簡単に測定
私はtime()を使用しようとしていますてプログラムのさまざまなポイントを測定ています。 わからないのは、変更前と変更後の値が同じなのはなぜですか。これは私のプログラムのプロファイルを作成するための最良の方法ではないことを理解しています。何か時間がかかるのを確認したいだけです。 printf("**MyProgram::before time= %ld\n", time(NULL)); doSomthing(); doSomthingLong(); printf("**MyProgram::after time= %ld\n", time(NULL)); 私が試してみました: struct timeval diff, startTV, endTV; gettimeofday(&startTV, NULL); doSomething(); doSomethingLong(); gettimeofday(&endTV, NULL); timersub(&endTV, &startTV, &diff); printf("**time taken = %ld %ld\n", diff.tv_sec, diff.tv_usec); の結果をどのように読み**time taken = 0 26339ますか?つまり、26,339ナノ秒= 26.3ミリ秒ということですか。 について**time taken = 4 45025はどうですか、それは4秒と25ミリ秒を意味しますか?
297 c++  c  linux  time  measurement 

3
Cの>>> =演算子とは何ですか?
同僚からパズルとして与えられたので、このCプログラムが実際にどのようにコンパイルされて実行されるのか理解できません。この>>>=演算子と奇妙な1P1リテラルは何ですか?ClangとGCCでテストしました。警告はなく、出力は "???"です。 #include <stdio.h> int main() { int a[2]={ 10, 1 }; while( a[ 0xFULL?'\0':-1:>>>=a<:!!0X.1P1 ] ) printf("?"); return 0; }

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