goo blog サービス終了のお知らせ 

みちこたんのぶろぐさんです

このブログでは、その日ふと思ったことや、わたしの紹介、パソコンのことを投稿していこうと思っています。

【C言語】不思議なことが起きました

2025-04-19 03:45:27 | パソコン

C言語で次の記述をしたとき、どちらの関数が先に呼び出されると思いますか?

(1) result = func1() + func2();

(2) result = -func1() + func2();

Linuxのgccの場合、(1)のときはfunc1が先に呼び出され、(2)のときはfunc2が先に呼び出されます。

通常の処理では問題はないと思いますが、順序に意味があるスタック等の場合は問題になります。

result = -pop() + pop();

なぜこのようになるか調べていますが、時間がかかりそうです。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

【C言語】double型変数が値をどのように保持?しているかです

2025-04-09 17:39:19 | パソコン

ちょっと確認してみたかったので、何も考えずに、適当におばかなプログラムを作ってみました。(コードとして適切ではないかもしれませんが)

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

【ひとりごと】WSL Ubuntuのmanコマンドでエラー表示が

2025-04-09 03:52:19 | パソコン

こんなこともあるのですね。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

【C言語】可変長配列は0で初期化する場合のみ初期化できます

2025-03-22 09:48:33 | パソコン

可変長配列は0で初期化する場合のみ初期化できます。でも条件があります。それは{0}ではなく{}と記述しないといけないということです。
{0}と{}は同じ結果になりますが意味が違います。{0}は最初の要素を0で初期化したあと残りの要素を0で初期化します。{}はすべての要素を0で初期化します。
可変長配列を{0}で初期化しようとするとコンパイル時に次のようなエラーが出ます。
error: variable-sized object may not be initialized except with an empty initializer
(可変サイズのオブジェクトは空の初期化子を除いて初期化できません)
このエラーからも{}なら初期化できることがわかります。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

【C言語】多次元配列をポインタで受け取るには

2025-03-05 15:39:11 | パソコン

多次元配列をポインタで受け取るには「(配列の次元数から1引いた次元数の)配列を指すポインタ」で受け取ります。3次元配列のときは「2次元配列を指すポインタ」で受け取ります。

(例)short data[x][y][z]; のときは short (*ptr)[y][z]で受け取ります

何で受け取ったらいいかわからないときは、次のようなプログラムを作りコンパイルすればいいです。(必ず警告が出るようにするので警告が出ます)

#include

int main(void)
{
short data[5][4][3] = {};

printf("%s", data); // 必ず警告が出るようにする

return 0;
}

これをコンパイルすると

test.c:7:10: warning: format ‘%s’ expects argument of type ‘char *’, but argument 2 has type ‘short int (*)[4][3]’ [-Wformat=]

と警告が出るので short int (*)[4][3] で受け取ればいいことがわかります。

※数学用語の使い方が間違っているかもしれません

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする