2

私の質問は簡単すぎるかもしれませんが、答えが見つかりませんでした。申し訳ありません。

次のようなコードがある場合:

...
#define N 6
...
float a, b;
...
a = 2.0 * 3 * N * b;
...

コンパイル後、このコードは次のようになりますか?

...
a = 36.0 * b;
...

つまり、定数部分はコンパイル時に計算されますよね?

前もって感謝します。

4

2 に答える 2

4

ほとんどの場合、保証されません。

プログラムの逆アセンブリを試してみることができます (デバッガ、逆アセンブラ、またはコンパイラ スイッチ (利用可能な場合) を使用して C コードからアセンブリ コードを生成します)。

于 2012-09-12T09:15:56.260 に答える
0

ここにサンプルコードがあります、

#include <stdio.h>

#define val 10

int main()
{

int b = 100;
int k = (5 * val) + b;
//int k = (5 * 25) + b; 

return 0;
}

val は前処理中に 10 に置き換えられます。

cpp ss.c私にくれます

int main()
{    
         int b = 100;
         int k = (5 * 10) + b;    
         return 0;
}

アセンブリ(gcc -S ss.c)を見ると、

 .file   "ss.c"
        .text
        .globl  main
        .type   main, @function
main:
.LFB0:
        .cfi_startproc
        pushq   %rbp
        .cfi_def_cfa_offset 16
        .cfi_offset 6, -16
        movq    %rsp, %rbp
        .cfi_def_cfa_register 6
        movl    $100, -8(%rbp)
        movl    -8(%rbp), %eax
        addl    $50, %eax            //5 * 10 calculated !!!
        movl    %eax, -4(%rbp)
        movl    $0, %eax
        popq    %rbp
        .cfi_def_cfa 7, 8
        ret
        .cfi_endproc
.LFE0:
        .size   main, .-main
        .ident  "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
        .section        .note.GNU-stack,"",@progbits

そのため、定数はコンパイル時にgccで計算されます。

于 2012-09-12T09:38:23.860 に答える