特定のコードでは、x
は5に初期化され、決して変更されません。 optimizing compilerはconstant foldになり、その情報を伝播できます。だから、それはおそらく、コンパイラはまたdead code eliminationを行っているだろうと
int main() {
printf("X is lesser than 10");
getch();
return 0;
}
予告の同等のものを生成することになります。
したがって、定数5と10の両方が消えてしまいます。
BTW、<conio.h>
およびgetch
は、標準C99またはC11には含まれていません。私のLinuxシステムはそれらを持っていません。一般に
(及びターゲットプロセッサのinstruction setとABIに応じて)小さな定数はしばしばKilian answeredとして、(即値オペランドなど)いくつかの単machine code命令に埋め込まれています。 code segmentには、いくつかの大きな定数(浮動小数点数、リテラル文字列、大部分はconst
グローバルまたはstatic
の配列と集合体)が読み込まれ、コンパイルされることがあります(マシンレジスタロード命令内の定数は、 PICの場合はPC) thisも参照してください。いくつかのアーキテクチャ(例えば、SPARC,RISC-V,ARMおよび他のRISC)は、2つの連続する命令(2つの部分で定数をロードすること)によってレジスタ内に広い定数をロードすることができ、これはobject filesのrelocationフォーマットに影響しますexecutables、多くの場合ELF)。
私はあなたのコンパイラに、アセンブラコードを出すように頼み、そのアセンブラコードを一目見してみることをお勧めします。 GCC(Linuxの場合はCygwinまたはMinGW)を使用している場合はgcc -Wall -O -fverbose-asm -S
でコンパイルしてください。私は取得していますあなたのコード内でgetchar
でgetch
を交換する場合は、私のDebian/Linuxシステム上:
.section .rodata.str1.1,"aMS",@progbits,1
.LC0:
.string "X is lesser than 10"
.text
.globl main
.type main, @function
main:
.LFB11:
.cfi_startproc
subq $8, %rsp #,
.cfi_def_cfa_offset 16
movl $.LC0, %edi #,
movl $0, %eax #,
call printf #
movq stdin(%rip), %rdi # stdin,
call _IO_getc #
movl $0, %eax #,
addq $8, %rsp #,
.cfi_def_cfa_offset 8
ret
.cfi_endproc
.LFE11:
.size main, .-main
.ident "GCC: (Debian 4.9.2-10) 4.9.2"
.section .note.GNU-stack,"",@progbits
を使用すると、64ビットのWindowsシステムを使用している場合は、あなたのアーキテクチャはx86-64可能性が高いです。ISA(thisへの回答を参照)とx86 calling conventions(そしてLinux x86-64 ABI; Windows用の同等の文書があります)を記述するdocumentationのトンがあります。
ところで、実際にこのような定数がどのように実装されているか気にする必要はありません。コードのsemanticsは、コンパイラがそれらを実装するために選択したものであれば、変更すべきではありません。コンパイラ(すなわち、Cの実装)に最適化(とそのような低レベルの選択)を任せてください。
あなたのコードには関係ありませんが、 "Xは10未満です"と言う文法上正しい方法です。 – cjm
他: "*言語*によって"、まったくありません。これは、*実装者*が把握する仕事です。 – Hurkyl
#2:あなたの質問はおそらくタイトルにもかかわらず、あなたの質問に存在するはずです。 – Hurkyl