为什么C语言里 char c;c="rfg";这样编译都可以通过?字符串常量赋给字符常量明显错误嘛
答案:4 悬赏:60
解决时间 2021-03-21 19:55
- 提问者网友:堕落的邪教徒
- 2021-03-20 21:05
打错了,符串常量赋给字符变量明显错误嘛,为什么C语言里 char c;c="rfg";这样编译都可以通过?
最佳答案
- 二级知识专家网友:冷眼_看世界
- 2021-03-20 22:19
编译能通过,但是会警告,警告内容如下:
warning: assignment makes integer from pointer without a cast
说明类型不匹配
我来解释下为啥:
char c;
说明c只占一个字节的存储单元,可以对c直接赋值,如:
c=200;
或
c='k';
都是可以的
至于"rfg",虽说是一个字符串,但是字符串本身代表的是该字符串的首地址。
之所以说类型不匹配,是char型和地址类型不是相同的类型,所以会有以上的警告,如果改成如下,则警告也会消除:
c=(int)"rfg";
把字符串的首地址这个值通过强制的类型转换,转换为int型的值。
注解:这个说法我亲自敲代码并编译过,请相信!
warning: assignment makes integer from pointer without a cast
说明类型不匹配
我来解释下为啥:
char c;
说明c只占一个字节的存储单元,可以对c直接赋值,如:
c=200;
或
c='k';
都是可以的
至于"rfg",虽说是一个字符串,但是字符串本身代表的是该字符串的首地址。
之所以说类型不匹配,是char型和地址类型不是相同的类型,所以会有以上的警告,如果改成如下,则警告也会消除:
c=(int)"rfg";
把字符串的首地址这个值通过强制的类型转换,转换为int型的值。
注解:这个说法我亲自敲代码并编译过,请相信!
全部回答
- 1楼网友:为你轻狂半世殇
- 2021-03-21 00:25
c是变量
再看看别人怎么说的。
- 2楼网友:兮沫♡晨曦
- 2021-03-21 00:16
不止编译能通过,而且可以运行。
这样赋值一般去最后一个字符,也就是g存入 变量c里面。
具体与编译器的实现有关,最可能的解释是隐式转换,字符串常量在拷贝给临时对象的时候,
一次读取每个字符,\0前面的字符是最后一次覆盖,所以值是g。
- 3楼网友:余生继续浪
- 2021-03-20 23:38
因为"rfg"在c语言里是字符串常量的首地址,因此它实际上是个整数,而char实际上是个unsigned short。
因此,c="rfg",实际上是把首地址这个整数转换成char然后赋值给c。
所以不但编译能通过,而且还可以运行,但结果就不是你想要的了。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯