C语言如果要用双引号为一个char类型变量赋值。
今年计算机专业大一。C语言学的还不错。今天有同学问我一个古怪的问题。在VC++6.0下测试。我们一般都用单引号圈起一个字符给一个char变量赋值,比如charx='A';...
今年计算机专业大一。C语言学的还不错。今天有同学问我一个古怪的问题。
在VC++6.0下测试。我们一般都用单引号圈起一个字符给一个char变量赋值,比如char x='A';
可是如果硬是要用双引号的话。比如char x="A";
写了一个程序。
#include <stdio.h>
int main()
{
char x;
x='A';
printf("%c%5d\n",x,x);
x="A";
printf("%c%5d\n",x,x);
return 0;
}
运行结果是:
A 65
? -92
那个-92是怎么来的?很疑惑。 展开
在VC++6.0下测试。我们一般都用单引号圈起一个字符给一个char变量赋值,比如char x='A';
可是如果硬是要用双引号的话。比如char x="A";
写了一个程序。
#include <stdio.h>
int main()
{
char x;
x='A';
printf("%c%5d\n",x,x);
x="A";
printf("%c%5d\n",x,x);
return 0;
}
运行结果是:
A 65
? -92
那个-92是怎么来的?很疑惑。 展开
4个回答
展开全部
看在你像个学霸的份上就帮你一下。
首先要说明的一点是,并不是所有的编译器都会让x="A";这条语句通过,即使是vc6,也会给出警告。
其次,x="A";这条语句涉及到了数据类型转换,因为“A”是个字符串,与x的类型不相同。至于是哪种数据类型转换成哪种数据类型,举个简单的例子就明白了,
有这么一条语句 const char *mystr="A";这条语句不需要数据类型转换,看等号的右边,是不是和你的x="A"是一样的。现在你再看我写的这条语句的等号左边,它是什么数据类型?是个指向字符串“A”的指针吧,也就是字符串的地址。那你在看x="A",此时的x得到的是什么?是不是“A”的地址。
如果能看懂汇编,那么你说的这个问题就不是问题。看不懂汇编也没关系,学会调试,善于观察也会找到答案的,想VC调试环境下的Watch窗口、Registers窗口、Memory窗口等等。
首先要说明的一点是,并不是所有的编译器都会让x="A";这条语句通过,即使是vc6,也会给出警告。
其次,x="A";这条语句涉及到了数据类型转换,因为“A”是个字符串,与x的类型不相同。至于是哪种数据类型转换成哪种数据类型,举个简单的例子就明白了,
有这么一条语句 const char *mystr="A";这条语句不需要数据类型转换,看等号的右边,是不是和你的x="A"是一样的。现在你再看我写的这条语句的等号左边,它是什么数据类型?是个指向字符串“A”的指针吧,也就是字符串的地址。那你在看x="A",此时的x得到的是什么?是不是“A”的地址。
如果能看懂汇编,那么你说的这个问题就不是问题。看不懂汇编也没关系,学会调试,善于观察也会找到答案的,想VC调试环境下的Watch窗口、Registers窗口、Memory窗口等等。
更多追问追答
追问
"A"为什么是个字符串?它里面明明只有一个字符- -
追答
因为你用了双引号,“A”占两个字节,A后面还有一个字符'\0'
展开全部
只有在初始化的时候能给char类型变量赋值
char str[]="HelloWorld";
在初始化之外,可以对指向字符常量的指针赋值
const char *p;
p="Hello";
有个“Hello”的字符串常量。
把指针p指向它,但它的值不可以改变,指针的指向可以改变。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不同编译器对于此行为的处理都不一致。也没有这个标准吧。学习考虑一些偏门奇怪的东西,并不是为了用它,而是为了避免犯那样的“错误”。
7: x=(char)"A";//需要强制转换,编译器都不让你过
00401043 mov edx,offset string "ch2=%o,ch3=%o\n ch2=%d,ch3=%d\n ch"... (0042301c)
00401048 mov byte ptr [ebp-4],dl//here
8: printf("%c%5d\n",x,x);
0040104B movsx eax,byte ptr [ebp-4]//here
0040104F push eax//here
00401050 movsx ecx,byte ptr [ebp-4]
00401054 push ecx
00401055 push offset string "ch0=%o,ch1=%o\n ch0=%d,ch1=%d\n ch"... (00423054)
0040105A call printf (004010f0)
0040105F add esp,0Ch
这是从程序里截取出来的,可以看到的x竟然是printf里面字符串地址低字节,你能想的通么。。
确实很怪异,不用太纠结,你已经知道这样是错误的了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2014-12-10
展开全部
因为 "A"是字符串
所以char转换为int 的时候
所以x="A"是指向字符串"A" 的指针
感觉是每次输出的结构都不太一样的对吧!
所以char转换为int 的时候
所以x="A"是指向字符串"A" 的指针
感觉是每次输出的结构都不太一样的对吧!
追问
每次输出的结果都一样都是-92。把A换成B也是一样。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询