| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1498 人关注过本帖
标题:一个把我蹂躏的死去活来的警告
取消只看楼主 加入收藏
liqingyulipeng
Rank: 1
等 级:新手上路
帖 子:63
专家分:3
注 册:2008-10-11
结帖率:77.78%
收藏
 问题点数:0 回复次数:2 
一个把我蹂躏的死去活来的警告
if ((a+1) >= b)
{
    return;
}
其中两个变量的定义如下:
unsigned short a;
unsigned short b;
问题:
当编译器在编译if ((a+1) >= b)这条语句的时候,会给出如下警告:
Old-style K&R C would produce possibly different results for relational.
Use explicit cast.

请问是为什么?怎样修改才能消除这个警告?
搜索更多相关主题的帖子: 死去活来 蹂躏 警告 
2009-07-16 16:03
liqingyulipeng
Rank: 1
等 级:新手上路
帖 子:63
专家分:3
注 册:2008-10-11
收藏
得分:0 
谢谢各位的热心,我已经找到原因了。
6楼的朋友的回答很接近,但是不对。
这个警告产生的原因是因为数据类型不匹配。常量在计算机中的默认存储类型是int型,而变量a和b的类型是unsigned short。当这两种不同类型的数据通过一个双目运算符进行运算时,编译器要先将其转化为相同的类型。这种转化的过程在ANSI标准和旧的K&R中是不一样的,所以会产生如问题所示的警告。
6楼的朋友的修改意在把两种数据类型强制转换为同种类型,不过没注意到数据常量的类型是不能被修改的,所以我们只能够修改变量的类型。正确修改如下:
if (((int)a+1) >= (int)b)
{
    return;
}
这种结果看上去很别扭,但确实只有这种办法。

至于有的朋友说为什么return后面没有数值或变量,怀疑这里有问题。其实这里是没有问题的。因为这条if语句是位于一个void类型的函数中。void类型的函数没有返回值,故这里只有return。
2009-07-17 16:00
liqingyulipeng
Rank: 1
等 级:新手上路
帖 子:63
专家分:3
注 册:2008-10-11
收藏
得分:0 
回复 9楼 StarWing83
这个可能和编译器有关系,在我的编译器下,常量的类型是没办法修改的。我把那条语句改为
if ((a+(unsigned short)1) >= b)
{
    return;
} 后,警告依然存在。
2009-07-18 09:10
快速回复:一个把我蹂躏的死去活来的警告
数据加载中...
 
   



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

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