私の質問は簡単すぎるかもしれませんが、答えが見つかりませんでした。申し訳ありません。
次のようなコードがある場合:
...
#define N 6
...
float a, b;
...
a = 2.0 * 3 * N * b;
...
コンパイル後、このコードは次のようになりますか?
...
a = 36.0 * b;
...
つまり、定数部分はコンパイル時に計算されますよね?
前もって感謝します。
私の質問は簡単すぎるかもしれませんが、答えが見つかりませんでした。申し訳ありません。
次のようなコードがある場合:
...
#define N 6
...
float a, b;
...
a = 2.0 * 3 * N * b;
...
コンパイル後、このコードは次のようになりますか?
...
a = 36.0 * b;
...
つまり、定数部分はコンパイル時に計算されますよね?
前もって感謝します。
ほとんどの場合、保証されません。
プログラムの逆アセンブリを試してみることができます (デバッガ、逆アセンブラ、またはコンパイラ スイッチ (利用可能な場合) を使用して C コードからアセンブリ コードを生成します)。
ここにサンプルコードがあります、
#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で計算されます。