Let's write β

プログラミング中にできたことか、思ったこととか

For文の再初期化式とアセンブラ

for文の再初期化式の中に複数の文は書けるので、Hello,worldを数回出すプログラムは2通りの記述方法があるのですが:

#include <stdio.h>

main () {
 int i;
 for(i = 0; i < 3; i++){ 
   printf("Hello,world\n");
 }
}

という書きかたと

#include <stdio.h>

main() {
 int i;
 for(i = 0; i < 3; printf("Hello,world"),i++){ 
 }
}

という書き方があります。

どちらも動作は同じでちゃんと3回出力されます。という事は生成されるアセンブラも同じはず..
とおもってgcc -Sでチェックしてみたところ、両者とも同じアセンブラが生成されました

	.file	"test.c"
	.section	.rodata
.LC0:
	.string	"Hello,world"
	.text
	.globl	main
	.type	main, @function
main:
.LFB0:
	.cfi_startproc
	pushl	%ebp
	.cfi_def_cfa_offset 8
	.cfi_offset 5, -8
	movl	%esp, %ebp
	.cfi_def_cfa_register 5
	andl	$-16, %esp
	subl	$32, %esp
	movl	$0, 28(%esp)
	jmp	.L2
.L3:
	movl	$.LC0, (%esp)
	call	puts
	addl	$1, 28(%esp)
.L2:
	cmpl	$2, 28(%esp)
	jle	.L3
	leave
	.cfi_restore 5
	.cfi_def_cfa 4, 4
	ret
	.cfi_endproc
.LFE0:
	.size	main, .-main
	.ident	"GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3"
	.section	.note.GNU-stack,"",@progbits