当前位置:编程学习 > C/C++ >>

C语言程序题

#include <stdio.h>
void main()
{
 char c1;
 c1='14';
 printf("%c\n",c1);
}

这个程序执行后结果是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

上一个:c 语言 链表问题
下一个:C 语言简单题目

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,