C语言程序题
#include <stdio.h>void main()
{
char c1;
c1='14';
printf("%c\n",c1);
}
这个程序执行后结果是4,为什么呢?
这个程序执行后结果是4,为什么呢?
答案:首先,可能有些令人吃惊, C 语言中的字符常量是 int 型, 而不是char型。所以’14’是可以的,VC直接无视,GCC会警告:多个字符的字符常量。当’’里的字符超过4个字节,也就是sizeof(int),VC会报错:常量里的字符太多,GCC会警告:字符常量太长。
其次,字符常量的值如果包含一个以上的字符,结果如何是没有定义的。在不同的编译器中可能会有不同的结果,我们看一下上面程序的汇编输出(只保留了相关部分):
1. MS VC6.0和VC 2005的汇编输出:
_main PROC NEAR
; Fileq255860949.c
; Line 3
push ebp
mov ebp,esp
push ecx
; Line 5
mov BYTEPTR _c1$[ebp], 52 ;00000034H
; Line 6
movsx eax,BYTE PTR _c1$[ebp]
push eax
push OFFSETFLAT:$SG337
call _printf
add esp,8
; Line 7
mov esp,ebp
pop ebp
ret 0
_main ENDP
2. GCC 4.1.1汇编输出:
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp,%ebp
andl $-16,%esp
subl $32,%esp
call ___main
movb $52,31(%esp)
movsbl 31(%esp),%eax
movl %eax,4(%esp)
movl $LC0,(%esp)
call _printf
leave
ret
.def _printf; .scl 2; .type 32; .endef
上面黑体的两行就是c1=’14’的汇编结果,2个编译器输出的汇编语法不同,但还是可以看到,真正参与赋值的只有1个字符,就是ACSII码52,也就是字符’4’,前面的1没有了。也就是说,这两个编译器都会忽略前面的字符,将’’里的最后一个字符赋给字符变量c1。
虽然这样是可以的,但为了保证可移植性,程序不应该使用这种具有特定值的字符常量。
这个问题你要注意这么几点,什么是char,char在内存是怎么存储的,"%c","\n"是什么意思,这几个问题,你明白了,相信你就没有疑问了,不管结果是不是4