单引号内放多个字符的问题

cllover 2011-06-10 01:50:38


#include<stdio.h>
void main()
{
//char c='abcde';
/*error C2015: too many characters in constant*/

//char c='abcd';
/*
warning C4305: 'initializing' : truncation from 'const int' to 'char'
warning C4305: 'initializing' : truncation from 'const int' to 'char'
输出d
*/

char c='abc';
/*
警告同上 输出c
*/
printf("%c\n",c);
}


相关链接
http://blog.csdn.net/qiyuan2009/archive/2009/04/30/4140163.aspx
http://zhidao.baidu.com/question/28843588.html?fr=qrl&cid=866&index=1&fr2=query

求解释:出现错误警告的详细原因。关于变量的初始化的详细过程(从程序开始,初值的处理,类型的处理,相关动作)
是缓冲区的原因(申请一个字节,所以编译器读取后面的字符把前面的覆盖了,为嘛多余四个字符报错?)
还是char类型引发的截取部分内存的原因?为嘛多于四个字符报错
...全文
1196 23 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
我真的是琦琦 2011-06-10
  • 打赏
  • 举报
回复
为什么要用单引号处理多字符。。。。。
majia2011 2011-06-10
  • 打赏
  • 举报
回复
4个,一般用作tag,就是一个ulong
赵4老师 2011-06-10
  • 打赏
  • 举报
回复
不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。

VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)
wizard_tiger 2011-06-10
  • 打赏
  • 举报
回复
字符串就用双引号,用单引号要么报错,要么用第一个字符,根据编译器不同而改变。
小小攻城师 2011-06-10
  • 打赏
  • 举报
回复
[Warning] D:\My Documents\C-Free\Temp\未命名1.cpp:4:9: warning: character constant too long for its type

上面是下面的代码的警告,gcc报的。这个和编译器有关,看完上面链接内我的回复,明白编译器怎么处理就可以,没必要追根问底这些没意义的东西。
#include<stdio.h>
int main()
{
char a='abcde';
return 0;
}
staticabc 2011-06-10
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 cllover 的回复:]
我只是想找高手解释一下变量初始化时候的内存分配以及面对不同类型 的时候编译器的动作,深入一点,我知道这样写法有错,可是这个错误深入一点却有很多问题,
[/Quote]
如果楼主有时间的话,可以看看 可变目标C编译器——设计与实现 这本书。
小小攻城师 2011-06-10
  • 打赏
  • 举报
回复
前一段时间有个人发了累死的帖子,看9 10 11楼我的回复
http://topic.csdn.net/u/20110524/22/ad25892b-ab2c-4256-bb26-79a662fa94e7.html
yiyamzen 2011-06-10
  • 打赏
  • 举报
回复
希望有所帮助
#include <stdio.h>

int main(int argc, char *argv[]){
char *str="abc";
printf("%s\n",str);/*abc*/
printf("%c\n",*(str));/*a*/

return 0;
}
张小毛 2011-06-10
  • 打赏
  • 举报
回复
因为32位处理器,4个字符刚好是32位
多思考,多想,异想天开!
或者看看编译出来的 ASM 代码,
不会问的人是 XX, 只会问的人更是 XX
iambic 2011-06-10
  • 打赏
  • 举报
回复
现在的学生连个hello world都问题百出,却喜欢把时间浪费在这里?
KevinHo 2011-06-10
  • 打赏
  • 举报
回复
这些都是语言的规定,C或者C++都是单引号处理单字符,双引号处理若干字符(字符串)。
如果想用单引号去测试若干字符,写代码测试一下就行了,不用去深究
辰岡墨竹 2011-06-10
  • 打赏
  • 举报
回复
我同意,因为用转义符比如\099什么的是合法的,但是多余4个不用看肯定错误。编译器解释语言时要先拆分Token、再解释符号等等,是多遍操作,不同遍数时发生了不同的错误。
AnYidan 2011-06-10
  • 打赏
  • 举报
回复
转意字符?
转义字符?
flysnowhite 2011-06-10
  • 打赏
  • 举报
回复
这个C标准没有规定处理方法,不同编译器不同处理。
AnYidan 2011-06-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 luciferisnotsatan 的回复:]
至于为什么4个字符报error,那要看编译器的文法规则了。
[/Quote]

三个字符可能是 八进制,Trigraph Sequences,转移字符。。。 四个则看COMPILER, 有的直接按STACK 原则取最后一个
luciferisnotsatan 2011-06-10
  • 打赏
  • 举报
回复
至于为什么4个字符报error,那要看编译器的文法规则了。
luciferisnotsatan 2011-06-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 coding_hello 的回复:]

单引号就是为了给你处理单字符的。你非要处理多字符,就用双引号啊!
[/Quote]
++

jiahehao 2011-06-10
  • 打赏
  • 举报
回复
应该会只截取第一个字符赋值吧。
野男孩 2011-06-10
  • 打赏
  • 举报
回复
仔细查了下标准,贴个标准的解释吧:

An ordinary character literal that contains more than one c-char is a multicharacter literal. A multicharacter literal has type int and implementation-defined value.

既然是int值,那也就是32bit了,超过4个字节那就不是int了吧
野男孩 2011-06-10
  • 打赏
  • 举报
回复
单引号就是为了给你处理单字符的。你非要处理多字符,就用双引号啊!
加载更多回复(3)

70,019

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧