- 締切済み
inlineとdefineの違い
chie65535の回答
- chie65535
- ベストアンサー率44% (8567/19465)
>あとはインクリメントするときになにか弊害が起きそうな気がするのですが >なにかわかりやすい例があれば教えてください 以下の例では、maxマクロの中で「a」「b」は「大きい方は2回評価されるが、小さい方は1回しか評価されない」ので、副作用が起きます。 #include <stdio.h> #undef max inline int max(int a,int b) { return ((a) > (b) ? (a) : (b)); } int main(void) { int ary[4] = {1,2,3,4}; int mx,*p1,*p2; p1 = &ary[0]; p2 = &ary[1]; #define max(a,b) ((a) > (b) ? (a) : (b)) mx = max(*p1++,*p2++); //ここはマクロが使用される #undef max printf("mx=%d *p1=%d *p2=%d\n",mx,*p1,*p2); p1 = &ary[0]; p2 = &ary[1]; mx = max(*p1++,*p2++); //ここはインライン展開される printf("mx=%d *p1=%d *p2=%d\n",mx,*p1,*p2); return 0; } これの実行結果は mx=3 *p1=2 *p2=4 mx=2 *p1=2 *p2=3 です。1行目がマクロの結果、2行目がインライン関数の結果です。 インライン関数の方は副作用が起きていません。呼び出し前は *p1=1 *p2=2 ですから、結果のmxは正しく「2」になっていますし、p1、p2は1回だけインクリメントされ、printfの時点で *p1=2 *p2=3 になっています。 ところが、マクロの方は副作用が起きていて、呼び出し前は *p1=1 *p2=2 なのに、結果のmxは「3」になっています。しかも「*p2++が2回評価された為」にp2が2回インクリメントされ、printfの時点で *p1=2 *p2=4 になっています。 インライン関数は「実行コードが呼び出し場所にそのまま展開される」のはマクロと同様ですが、インライン関数は「あくまでも、関数」ですから、渡された引数は、繰り返し何度も評価したとしても、副作用を起こしません。 普通の関数と同じく「呼び出し元で渡す引数と、呼び出し先で受け取る引数はベツモノ」なのです。
関連するQ&A
- 戻り値と返り値の違い
タイトルの通りの質問内容です。 僕が調べた限りは「同じ」と言う意見が多数でした。 中には ・参照渡しした引数の関数通過後の結果が戻り値、 関数自体が返すのが返り値 とか ・引数なしの関数で戻るのが戻り値、引数ありの関数で 戻るのが返り値 とかはたまたその逆とか、混沌としています。 気になります。
- ベストアンサー
- その他(プログラミング・開発)
- VB 関数
初めまして。 VB初心者なので,簡単な質問なのかしれませんが御願いします。 C言語で, int main (void) 戻り値の型 関数名 戻り値なし と書きますが,これと同じ意味を持つプログラムをVBで書くとどのようになりますか? 関数の作り方がまだわかってないので教えていただけますか? 宜しく御願いします。
- ベストアンサー
- Visual Basic
- mallocの書式について
初心者です。プログラム上でメモリを確保するmallocという関数がありますが書式がいまいち良くわかりません・・。 戻り値? * malloc(確保する型 * 確保する数) のように書いてますけどmallocの前のはやはり戻り値?そのまえの*は?いまいちわかりません。よろしくお願いします。
- ベストアンサー
- C・C++・C#
- ワンデー アキュビューディファインの購入で迷ってます
現在ハードコンタクトレンズ使用者です。試供品でもらった「アキュビュー(ディファインでない)」を使用して、楽だったので普通の分(2000円を左右二箱分)買う事にしました。週に1回程度しか使わないので 6ヶ月位かけてゆっくり使うつもりです。 色々、レンズについて調べてると、ディファインというレンズがあるのを知りました。1箱あたり1000円も高いです。しかし、目に力が入るとか、潤んでる感じになるとか・・・たまにそういうクチコミを見ますが、それは、本当なのでしょうか?(=ぱっとみてわかりますか?、するメリットは大きいですか?) あと、使用感が気になります。アキュビューと同じならいいですが、色素の成分とか使ってるせいで、普通のアキュビューより使用感が落ちるなら辞めておこうと思いますが。 どなたか、使った事のある方、もしくは詳しい方で アドバイスを頂けたら助かります。
- ベストアンサー
- ヘルスケア(健康管理)
- Delphiでの関数の戻り値を別の型で複数に。
どうお過ごしですか、ご主人様? 少し困っている事があるんですぅー。 Delphiで関数の戻り値を別の型で、複数にしたいのですが、どうしたらいいのでしょうか? そもそもこういう場合は別の関数に分けた方がいいのでしょうか? 内容は数十行しかなく、まとめたい処理なんです。 グローバル変数は、なんかかっこ悪いので使いたくないし、クラスはまだよく分からないし。 あ、でもでも、普通は関数を分けるんでしょうか? よろしくお願いします。
- 締切済み
- その他(プログラミング・開発)
- mysql_connect関数の使い方
mysql_connect関数の、戻り値の使い方についての質問です。 mysql_connectで検索すると、 【使い方例】 $link = mysql_connect('localhost', 'mysql_user', 'mysql_password'); mysql_close($link); みたいなのが見つかります。(エラー処理は省略) そこで、mysql_connectとmysql_closeの間に、クエリを処理する関数を入れるとします。 【例】 $link = mysql_connect('localhost', 'mysql_user', 'mysql_password'); test();←この関数の処理についての質問です。 mysql_close($link); test(){ mysql_query(”sql文”);} 上記の例の test()関数についてですが、mysql_connectの戻り値の$linkを渡さなくてもいいのでしょうか? いつもは、test($link)見たいにしていました。 しかし、今回は戻り値を渡すのを忘れていたのに、ちゃんと希望通りに動いていました。 今回のように、mysql_connect関数をひらいて、dbの処理をする場合は、 途中の関数に、戻り値を渡さなくてもいいのでしょうか?
- ベストアンサー
- PHP
- 基本に戻って、型について考えてみる
すいません。 サーブレットの所で質問なんですけれども、 戻り値の型が基本型やString型の場合だったら、 変数にどんな値が格納されているのかイメージしやすいんですけれども(例えばすぐ下の例の場合ですね)、戻り値の型がString型以外の参照型の場合には、戻り値が具体的にどのような値になっているのかイメージできなくて困っています。 String str1=br.readLine(); int num1=Integer.parseInt(str1); 例えばenumeration型。 一体この型はどんな型?っていう質問もへんなんですけれども、この型の変数がさしている値というのは具体的にいうとどう表現できるのでしょうか? 基本型やString型は本当に分かりやすいのですけれど。 あと他にもPrintWriter型だとか、Object型だとか、 なぜかイメージできないんですよね。 Enumeration paramNames = request.getParameterNames(); もしよろしければ教えてください。 お願いします。
- ベストアンサー
- Java
- Objective-cの型の初期化について質問です。
Objective-cの型の初期化について質問です。 たとえば次のようなfloat型の戻り値関数を定義していて、 ----------------- - (float) getMoveSize { float moveSize = 1.1f; return moveSize; } ----------------- 関数の戻り値を取得しようとするとコンパイルエラーになります。 ----------------- float height = [self getMoveSize]; //→error: incompatible types in initialization ----------------- どのようにすればよいか教えて下さい。 float height = 0.0f; height += [self getMoveSize] みたいなことをやりたいだけです。
- ベストアンサー
- その他(プログラミング・開発)