| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1439 人关注过本帖
标题:一个编译器可以,一个不行,到底语句是否正确。
只看楼主 加入收藏
蔡梓锋
Rank: 4
等 级:业余侠客
帖 子:106
专家分:202
注 册:2013-4-20
收藏
得分:0 
回复 7楼 wp231957
就是编译都不过啊!我用DEV-C++运行不了,用C与C++程序设计学习与实验系统 2013这个就可以。

加油加油!
2013-09-22 17:54
蔡梓锋
Rank: 4
等 级:业余侠客
帖 子:106
专家分:202
注 册:2013-4-20
收藏
得分:0 
回复 9楼 Hamster4U
我用DEV-C++运行不了,用C与C++程序设计学习与实验系统 2013,一个可以一个不行,所以我不知道是不是语法有问题

加油加油!
2013-09-22 17:56
303770957
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:838
专家分:2125
注 册:2005-9-10
收藏
得分:0 
不要再纠结这个问题了,赶快结贴才是正道!

♂ 死后定当长眠,生前何须久睡。♀
2013-09-22 17:56
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
以下是引用蔡梓锋在2013-9-22 17:54:45的发言:

就是编译都不过啊!我用DEV-C++运行不了,用C与C++程序设计学习与实验系统 2013这个就可以。

要么是你的软件有问题 要么就是你不会用 至于为什么我也不知道 你连报什么错都不说 这种问题没法回答
2013-09-22 17:56
蔡梓锋
Rank: 4
等 级:业余侠客
帖 子:106
专家分:202
注 册:2013-4-20
收藏
得分:0 
回复 14楼 zklhp
4 16 D:\xuexi\c语言\Untitled1.cpp [Warning] deprecated conversion from string constant to 'char*' [-Wwrite-strings]
软件啊肯定没问题。

加油加油!
2013-09-22 19:03
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:10 
有warning不表示不成功
2013-09-22 19:23
蔡梓锋
Rank: 4
等 级:业余侠客
帖 子:106
专家分:202
注 册:2013-4-20
收藏
得分:0 
回复 16楼 zklhp
但是确实编译不成功。我用这个软件很久了,可以绝对的告诉你,软件没问题,我的操作也没问题,不相信我的话,可以下载DEV试下,也谢谢你为我解答。

加油加油!
2013-09-22 20:30
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册


我挺闲的 专门下载了这个软件试 结果是成功的

图片附件: 游客没有浏览图片的权限,请 登录注册


exe也是生成了的 既然楼主用了很长时间 我想楼主应该能自己解决这个问题吧
2013-09-22 21:33
歌舞伎町
Rank: 2
等 级:论坛游民
帖 子:30
专家分:38
注 册:2013-8-7
收藏
得分:0 
从字面上看,就是不建议将字符串常量转换成指向char型的指针
从逻辑上看,可能是因为字符串常量不是想改就改的,也就是如果你修改key所指向的内容,会提示对内存的非法操作
通过百度,原来这个C++的特性是被定义为“不建议使用的特性”,所以新版本的编译器都会提示警告甚至通不过,因为貌似传言这个特性迟早要从C++中除去
以上是我的理解
2013-09-22 22:35
303770957
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:6
帖 子:838
专家分:2125
注 册:2005-9-10
收藏
得分:0 
是编译器不同造成的,将程序改成如下所示就可以了:
#include <stdio.h>
 int main()
 {
     const char *key = "11001100010001110";
     return 0;
 }
原因是:
用最新的g++编译一下楼主的代码就会得到 deprecated conversion from string constant to 'char* 警告。
因为char *背后的含义是:给我个字符串,我要修改它。
而理论上,我们传给函数的字面常量是没法被修改的。
所以说,比较和理的办法是把参数类型修改为const char *
这个类型说背后的含义是:给我个字符串,我只要读取它。
假定你想使用一个char*类型的变量,有时指向一个字符串,有时指向另外一个字符串。开始的代码就像这样:
char *msg;
msg = "hello";
msg = "good-bye";

编译器会对这段代码给出两段警示,说"deprecated conversion from string constant to 'char *'",
意思就是说你没有能力修改字符串的内容。如果将代码写成这样,如:
char *msg = "hello";
*msg = 'j';
printf( "%s/n", "hello" );

编译器会通过编译,实际上会将msg指向的内容从"hello"转变为"jello", 正确的解决方法是将msg声明为一个指向不变字符串的指针:
const char  *msg;
msg = "hello";
msg = "good-bye";

这段代码可以成功编译,并且将msg指向的值如愿改变,但如果你将指针指向的指进行赋值:
*msg = 'j';
将会产生一个错误,不能修改一个字符串常量

注意如下的代码,此代码编译时不会出现警告也不会出现任何错误:
const char  *msg;
char   buf[ 10 ];  //注意不能使用char *buf;
sprintf( buf, "%03d/n", 7 );
msg = buf;

改变buf的内容是可以的,因为它并没有被声明为常量。
在这种情况下,msg将指向一个字符串,"007/n".
像这种语句
*buf = 'x';
将会正确编译执行,但像
*msg = 'x';
将会产生一个警告,因为msg指向的内容不允许改变

还有一种方法是使用强制转换,使用强制转换意味着你清楚会出现什么情况,
不需要编译器为你做出判断,例如下面的代码将不会产生警告:
char  *msg;
msg = (char *) "hello";

但一旦你使用强制转换,编译器对如下语句进行编译时,也不会出现错误或警告
*msg = 'j';

这个错误将一直存在,但并不会被发现,直到运行时。那时再找出错点就相当麻烦了,比编译器提醒你,麻烦多了。
所以,最好不要对字符串使用强制转换。

const  指针

根据const的位置不同,可以有以下四种情况:
const char* const msg_0;
const char  *msg_1;
char* const msg_2;
char *msg_3;

其中,msg_0是一个constant指针指向一个const字符串。
这个声明编译器会给出一个警告,因为msg_0的指向没有被初始化,而且之后的语句也无法对mg_0进行赋值,如
const char const *msg_0 = "hello";
会编译成功,但
*msg_0 = 'j';或者
msg_0 = "good-bye";
 将会产生错误
msg_1既可以指向一个const字符串,也可以指向一个可变的字符串,但是不能修改它所指向的字符串的内容。

编译msg_2这条语句,会出现和编译msg_0一样的错误。因为指针是一个常量,所以它应该首先被赋值。如果刚开始已经赋值,那么它可以对指向的字符串内容进行修改,如:
char buf[ 10 ];
char * const msg_2 = buf;
这段代码里,msg_2指向buf[0],并且永远指向这个地址,不会改变;
对于msg_3,就没太多可以说的。你可以改变指针,也可以改变指针指向的内容.




♂ 死后定当长眠,生前何须久睡。♀
2013-09-22 23:37
快速回复:一个编译器可以,一个不行,到底语句是否正确。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.032801 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved