【C言語】
free(ptr)しても
ptrはNULLにならない

■何と表示されますか? freeしたらfree関数がポインタをNULLにしてくれると思っている人!残念ですが間違っています。 参考: CFAQ-4.8: 呼んだ側のポインターの値は変わらなかった。

投稿日:
カテゴリー: 未分類

【C言語】 static関数のプロトタイプ宣言を書くのが面倒臭いと思うのが正しい

■static関数のプロトタイプ宣言を書くのが面倒くさい 業務で、「ソースコードを上から下へ読めるようにmain()関数を上に書く」とルール化して、static関数のプロトタイプ宣言を何百行もコメント付きで記述するプロジ… 続きを読む 【C言語】 static関数のプロトタイプ宣言を書くのが面倒臭いと思うのが正しい

【C言語】enum では最初の定数は非ゼロにするか、あるいはエラーを示すものにする

■デバッグを楽にする小技 上記のプログラムでenumの先頭でSun=1の設定をしていないと、初期化していない xを引数にしてnum2Week(x)を呼んだ場合”日曜日”が表示され(る事が多く)問題検出が困難となる。 参考… 続きを読む 【C言語】enum では最初の定数は非ゼロにするか、あるいはエラーを示すものにする

投稿日:
カテゴリー: 未分類 タグ:

【C言語】マルチステートメントの勧め

■シングルステートメント ■マルチステートメント(推奨) 表のように書ける時は、ぱっと見ただけで瞬間的に理解できるのでマルチステートメントがお勧めです。 参考: プログラム言語 C の推奨されるスタイルとコーディング規範… 続きを読む 【C言語】マルチステートメントの勧め

【C言語】
コーディング規約で
思考が止まる
ブラックルールとは?

■嫌いなブラックルール ・char/short/int/long を直接記述する事禁止する・数値を直接記述すること禁止、必ずマクロにする事・変数の宣言は関数の先頭でまとめて行い別の行で全てゼロで一律もれなく初期化する事・… 続きを読む 【C言語】
コーディング規約で
思考が止まる
ブラックルールとは?

【C言語】
今時(C99仕様)の変数宣言と
時代遅れのとりあえず0で初期化

■時代遅れの変数宣言と初期化(非推奨) (1)変数宣言(2)とりあえず0で初期化(3)本当の値設定の3部構成からなるC89仕様時代のよくあるスタイルです。 14行目でyの初期化が漏れているので未初期化の警告が出ます。20… 続きを読む 【C言語】
今時(C99仕様)の変数宣言と
時代遅れのとりあえず0で初期化

【C言語】
自作のstrlen/strncpy/strncmpは標準関数の5~6倍遅かった

■1.パチモノ自作関数を実務で作ってはいけない と別の投稿でも書きましたが どのくらい処理速度が違うのかmem系関数に続いてsrc系関数を自作関数と標準関数で比較してみました。 ■2.自作関数vs標準関数 やっている事は… 続きを読む 【C言語】
自作のstrlen/strncpy/strncmpは標準関数の5~6倍遅かった

【C言語】
sscanf関数の正規表現で
csvファイルを解析し
郵便番号から住所を表示

■このコードで学習できること ・scanfの正規表現・コメントの書き方 ■郵便番号⇒住所プログラム コピペしてコンパイル&実行してみて下さい。 ■製造年と作者名をコメントで明示すると高品質になる 経験則ですが、ファイルヘ… 続きを読む 【C言語】
sscanf関数の正規表現で
csvファイルを解析し
郵便番号から住所を表示

投稿日:
カテゴリー: 未分類 タグ:

【C言語】
キャッシュの有無で
二次元配列参照の処理速度は
物凄く違う

■1.要するに安近短が百倍早いらしい for(x;for(yとfor(y;for(xの処理速度を比較してみました。 ■2.for(x;for(y対for(y;for(x やっている事はどちらも2次元配列を文字’Q&#82… 続きを読む 【C言語】
キャッシュの有無で
二次元配列参照の処理速度は
物凄く違う

【C言語】
自作のmemset/memcpy/memcmpは標準関数の20倍遅かった

■1.パチモノ自作関数を実務で作ってはいけない と別の投稿でも書きましたがどのくらい処理速度が違うのか自作関数と標準関数を比較してみました。 ■2.自作関数vs標準関数 やっている事はコピー元の自動変数配列を文字Qで埋め… 続きを読む 【C言語】
自作のmemset/memcpy/memcmpは標準関数の20倍遅かった

【C言語サンプル】
構造体ポインタの使い方

■単純な構造体メンバの参照 ■間接演算子 * と構造体ポインタ 読みにくいのでこのスタイルは通常使用されません。 ■アロー演算子 -> と構造体ポインタ 「構造体ポインタの指す先のメンバ」と自然に読めるので通常このスタイ… 続きを読む 【C言語サンプル】
構造体ポインタの使い方

【C言語】
ヨーダ記法は
昭和のウサギ跳びと同じ臭い
今は-Werrorオプションで
if(x=0)のバグを防ごう

warning: suggest parentheses around assignment used as truth value  警告:真偽値として使用するなら代入式にカッコつける[-Wparentheses] ■… 続きを読む 【C言語】
ヨーダ記法は
昭和のウサギ跳びと同じ臭い
今は-Werrorオプションで
if(x=0)のバグを防ごう

【C言語サンプル】
配列の中から 最大値と最小値を見つける

■1.サンプルコード コピペしコンパイル&実行し動作確認してください。 ■2.昔風の書き方でバグのあるサンプルコード このソースコードはバグっているので真似しないでください。力試しに正しく動くように直してみましょ… 続きを読む 【C言語サンプル】
配列の中から 最大値と最小値を見つける

【C言語】
Shift_JISで書いたプログラムをgcc/clangでコンパイルしてはいけない

■1.gccでエラーにならないので困る このプログラムがShift_JISで書かれている場合、いわゆる5C問題で全部コメントになります。 gccで何のエラーもなくコンパイルできますが何もしないプログラムとなります。 エラ… 続きを読む 【C言語】
Shift_JISで書いたプログラムをgcc/clangでコンパイルしてはいけない

【C言語】
printf(“%zu\n”,strlen(“全角”)); 全角は2バイト固定か?

■1.次のプログラムは何と表示されますか? ■2.ソースコードがEUCの場合 プログラマの期待した結果になります。 ■3.ソースコードがShift_JISの場合 プログラマの期待した結果にこの例ではなりましたが、 gcc… 続きを読む 【C言語】
printf(“%zu\n”,strlen(“全角”)); 全角は2バイト固定か?

【C言語】
早期リターンvs関数出口1つ

■1.早期リターンは読みやすい(推奨) コーディング規約 「関数の出口1つだけ」を強要するプロジェクトは多いです。 しかしこのルールを守った読みやすいコードを見たことがありません。 規約を強要する人は是非ともリーダブルコ… 続きを読む 【C言語】
早期リターンvs関数出口1つ

【C言語】
設定後未使用変数が
未使用変数より危ない理由
(set but not used)

warning: variable ‘r2’ set but not used 警告:変数 ‘r2’ は設定されたが未使用[-Wunused-but-set-variable] ■1.コピペミスの可能性 設定後未使用の問… 続きを読む 【C言語】
設定後未使用変数が
未使用変数より危ない理由
(set but not used)

【C言語】
sizeof演算子は関数ではない
strlen()でもない

■1.sizeof演算子は関数ではない sizeof演算子を関数だと思っている人は結構多く、この人達は【sizeofの戻り値】って書くのだけれど、1+1の戻り値って言わないですよね。 聖典プログラミング言語C A7.4.… 続きを読む 【C言語】
sizeof演算子は関数ではない
strlen()でもない

【C言語】
初期化されていない自動変数
(ローカル変数)の値はゴミ

warning: ‘ptr’ is used uninitialized 警告:未初期化変数を使用した[-Wuninitialized] ■1.初期化されていない自動変数の問題例 初期化していない自動変数の値はゴミです。… 続きを読む 【C言語】
初期化されていない自動変数
(ローカル変数)の値はゴミ

【C言語サンプル】
qsort関数の使い方 整数配列、ポインタ配列、構造体配列の並べ替え

■4つの準備 qsortを使うには以下の4つを準備してください。(1)ソート対象の配列(2)配列要素数(3)配列一つのサイズ(4)比較関数 ■整数配列をqsort n1 – n2の引き算の結果で数値順にソート… 続きを読む 【C言語サンプル】
qsort関数の使い方 整数配列、ポインタ配列、構造体配列の並べ替え

【C言語】2022年版
浮動小数点で float型はやめなさい float型対double型

■1.float型対double型 ●2003年初版のCプログラミング診断室で紹介されている「float型はやめなさい」をgcc11版で試してみた。●2022年現在でも「float型はやめなさい」だった。処理時間でも精度… 続きを読む 【C言語】2022年版
浮動小数点で float型はやめなさい float型対double型

【C言語】
for文とwhile文の使い分け
(1行vs4行)

■whileで記述すると4行も必要 while文は(1)変数宣言、(2)初期化式、(3)ループ条件、(4)更新式で4行も必要です。 ■for文なら1行で書けるので楽 変数宣言、初期化式、ループ条件、更新式が1行で書けます… 続きを読む 【C言語】
for文とwhile文の使い分け
(1行vs4行)

【C言語サンプル】
大文字小文字変換 (isupperとtolowerの使い方)

■標準ヘッダを使った例(推奨) ctype.hで定義されている標準関数を使うとコードが読みやすくなります。 変換対象が/usr/include/stdio.hのようにアスキーコードだけで記述されている場合このコードで動き… 続きを読む 【C言語サンプル】
大文字小文字変換 (isupperとtolowerの使い方)

【C言語サンプル】
rand乱数生成関数の使い方
(じゃんけんゲーム)

■乱数の種まき ●srand関数による乱数の種まきをしないと何回実行しても同じ結果となる●実務ではrand関数よりrandom関数を使う ■乱数を生成するrand関数の使い方 srand関数を使用して乱数の種を蒔かないと… 続きを読む 【C言語サンプル】
rand乱数生成関数の使い方
(じゃんけんゲーム)

【C言語】0を無理にマクロにするとかえってマジックナンバーになる

■1.間違った理解・正しい理解 ●間違った理解マジックナンバーとは裸の数字の事である。マクロは裸の数字ではないのでマジックナンバーではない。●正しい理解マジックナンバーとは意味のわからない数字の事である。 ■2.無理に0… 続きを読む 【C言語】0を無理にマクロにするとかえってマジックナンバーになる

【C言語】
関数名や変数名に漢字を使うとものすごくわかりやすい

■1.変数名や関数名に漢字を使用した例 2022年令和4年現在gcc11,clangでコンパイル可能です!3秒もあれば処理内容が理解できるのでは? ■2.deepLで訳して書き直してみた DeepL翻訳サイトで訳してもら… 続きを読む 【C言語】
関数名や変数名に漢字を使うとものすごくわかりやすい

【C言語】
長い文字列は複数行に分けて書いてOK!円記号¥も不要

■長い文字列(寿限無) ■短い文字列を連結して長い文字列を作る ■予期せぬ文字列リテラルの連結(例1) C言語では連続する文字列リテラルは連結されます。つまり”文字列A” ”文字列B”は”文字列A… 続きを読む 【C言語】
長い文字列は複数行に分けて書いてOK!円記号¥も不要

【C言語】
無限ループの書き方
while(1)を避け
for(;;)を使う

■1.無限ループwhile(1)には亜種が多い(非推奨) while(1)から派生した色々な書き方があります。for(;;)の派生は、せいぜいセミコロンの空白くらいです。 ■2.while(1)に文句を言うツール対策(非… 続きを読む 【C言語】
無限ループの書き方
while(1)を避け
for(;;)を使う

【C言語】
文字列配列の要素数を指定すると終端文字’¥0’が入らず暴走する時がある

■1.暴走するstrlen ■2.暴走するprintf ■3.暴走するstrcmp ■4.暴走するstrcpy これらのプログラムが何と表示するかは動かしてみないと誰にもわかりません異常終了するかもしれません。 配列 a… 続きを読む 【C言語】
文字列配列の要素数を指定すると終端文字’¥0’が入らず暴走する時がある

【C言語】ビットを
立てる x |= (1<<bit); 
下げる x &= ~(1<<bit);
何もしない x |= (0<<bit);

■1.次のプログラムは何と表示されますか? ●解答 ■2.ビットの立て方 ■3.ビットの下げ方 ビット演算子チルダ~を使う ■4.何もしない x |= (0<<bit);でbitは立も下がりもしないのでデッド… 続きを読む 【C言語】ビットを
立てる x |= (1<<bit); 
下げる x &= ~(1<<bit);
何もしない x |= (0<<bit);

【C言語】
【|】と【||】、【&】と【&&】の違い短絡評価とは?

■1.【|】と【||】の違い ●on()|off()  |はビット演算子なので両辺の関数は必ず呼ばれる(評価される)1|01=1=真なのでthenが表示される。 ●on()||off()) ||は論理演算子なのでon()… 続きを読む 【C言語】
【|】と【||】、【&】と【&&】の違い短絡評価とは?

【C言語】”文字列”とは
【単なるchar *】。
【符号無しchar *】ではなく
【符号付きchar *】でもない

warning: pointer targets in passing argument 1 of ‘strcpy’ differ in signedness 警告: ‘strcpy’ の第一引数… 続きを読む 【C言語】”文字列”とは
【単なるchar *】。
【符号無しchar *】ではなく
【符号付きchar *】でもない

【C言語】構造体を引数や戻り値にすると処理速度が遅くなるのでポインタを使おう

warning: function call has aggregate valuewarning: function returns an aggregate 警告:構造体を引数にした警告:構造体を返却した[-Wagg… 続きを読む 【C言語】構造体を引数や戻り値にすると処理速度が遅くなるのでポインタを使おう

【C言語】エラーを返すscanf関数の戻り値をチェックしよう(あれば便利程度strcpyの戻り値は無視してOK)

warning: ignoring return value of ‘scanf’ declared with attribute ‘warn_unused_result’ 警告:属性’warn_unused… 続きを読む 【C言語】エラーを返すscanf関数の戻り値をチェックしよう(あれば便利程度strcpyの戻り値は無視してOK)

【C言語サンプル】
今時の Hello world!
(C89/90を捨てC99へ移行)

c99仕様のC言語ではmain 末尾の return 0 は書かなくてもOK! C89仕様のC言語:30年以上前の古い仕様 gcc hello.c -Wall -std=c89 でコンパイルするとgccにmain のre… 続きを読む 【C言語サンプル】
今時の Hello world!
(C89/90を捨てC99へ移行)

【C言語】
未定義動作はコンパイラが出鱈目な動きをしてもプログラマは文句を言えない

warning: operation on ‘x’ may be undefined 警告: ‘x’ に対する演算は未定義動作の可能性があります。[-Wsequence-point] ■1.未定義… 続きを読む 【C言語】
未定義動作はコンパイラが出鱈目な動きをしてもプログラマは文句を言えない

【C言語】
文字列末尾の終端文字¥0は
自分で書かなくてOK

warning: embedded ‘\0’ in format 警告:書式中に終端文字¥0があると書式終了[-Wformat-contains-nul] ■1.末尾の¥0は自分で書かなくてOK 文字列リテラルの終端文字… 続きを読む 【C言語】
文字列末尾の終端文字¥0は
自分で書かなくてOK

【C言語】文字配列に終端文字¥0を入れる隙間が無い時はstrNcpyよりC99構造体の指示初期化子が便利

warning: ‘strncpy’ output truncated before terminating nul copying 8 bytes from a string of the same length 警告… 続きを読む 【C言語】文字配列に終端文字¥0を入れる隙間が無い時はstrNcpyよりC99構造体の指示初期化子が便利

【C言語】
32bit変数を 32bitシフトすると
0になる保証無し!
8bit変数を24bitシフトすると?

warning: left shift count >= width of type 警告:左シフト数 >= 型幅[-Wshift-count-overflow] ■シフトし過ぎ(定数で) オペランドのビット… 続きを読む 【C言語】
32bit変数を 32bitシフトすると
0になる保証無し!
8bit変数を24bitシフトすると?

【C言語】
if(“文字列”==”文字列”)は 文字列領域のアドレス比較で 文字列比較とは違う

warning: comparison with string literal results in unspecified behavior 警告:文字列リテラルに対する比較の結果は未規定動作です。代わりにstrcmp… 続きを読む 【C言語】
if(“文字列”==”文字列”)は 文字列領域のアドレス比較で 文字列比較とは違う

【C言語】
文字列が空かどうか終端文字¥0を使って判定する方法

■null判定って書くのは止めよう! 【null判定】【ヌル判定】【ナル判定】って書くのは止めよう! 【NULLポインタ判定】【空文字列判定】【終端文字¥0判定】と書こう。 ■推奨例:空文字列を判定する関数 NULLポイ… 続きを読む 【C言語】
文字列が空かどうか終端文字¥0を使って判定する方法

【C言語】
局所変数のループカウンタにloop_counterと長い名前を付けるのは止めよう

■1.長い名前は本当に分かりやすいですか? ↑↓これは間違いだ! 【保守の事を考えると”変数名”に意味のない名前を与えると後でわからなくなる。多少面倒でも後で見て何を意味している変数なのかわかるよ… 続きを読む 【C言語】
局所変数のループカウンタにloop_counterと長い名前を付けるのは止めよう

【C言語】
デッドコード(到達不能コード)
switch文内で初期値のある変数宣言

warning: statement will never be executed 警告:宣言時の代入文が実行されることはない[-Wswitch-unreachable] ■1.case文が無くてもエラーにならない 意味… 続きを読む 【C言語】
デッドコード(到達不能コード)
switch文内で初期値のある変数宣言

【C言語】
配列の要素数を求める時はsizeof(配列の型)ではなくてsizeof(配列名[0])と書こう

warning: expression does not compute the number of elements in this array 警告:この計算式では配列の要素数は求まりません。[-Wsizeof-ar… 続きを読む 【C言語】
配列の要素数を求める時はsizeof(配列の型)ではなくてsizeof(配列名[0])と書こう

【C言語】ゼロ除算の
見つけ方とガード処理
(Divide By Zero)

warning: division by zero 警告:ゼロ除算[-Wdiv-by-zero] ■1.ゼロ除算を見つけるのは難しい コンパイラの警告や静的解析ツールを使用してもゼロ除算を見つけるのは難しい。 人海戦術で… 続きを読む 【C言語】ゼロ除算の
見つけ方とガード処理
(Divide By Zero)