首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >值未被转换更改时发出警告

值未被转换更改时发出警告
EN

Stack Overflow用户
提问于 2016-07-10 00:00:04
回答 2查看 81关注 0票数 1

考虑一下这个项目:

代码语言:javascript
运行
复制
int main() {
  int ju = 1;
  short ki = ju;
  return ki;
}

编译会产生一个警告:

代码语言:javascript
运行
复制
conversion to ‘short int’ from ‘int’ may alter its value [-Wconversion]
   short ki = ju;
              ^

然而,根据去医生那里

别警告..。如果值未被转换更改,如"abs (2.0)“中所示。

我们正在处理1的值,它可以很容易地存储在intshort中。值不被转换更改,那么为什么要发出警告呢?

EN

回答 2

Stack Overflow用户

发布于 2016-07-10 00:40:30

忽略任何可能的编译器优化:

代码语言:javascript
运行
复制
int main() {
  int ju = 1;
  short ki = ju; /* Compiler won't [probably] make use of (without optimizations) what the value of ju is at runtime */
  return ki;
}

另一个示例(即使对编译器进行优化,也无法确定在编译时将ju分配给ki时的值):

代码语言:javascript
运行
复制
int foo() {
  int ju = 1;
  short ki = 1;

  scanf("%d", &ju);

  ki = ju; /* (Compiler will issue the warning) What's the value of ju? Will it fit in ki? */

  return ki; /* Another implicit conversion, this one from short to int, which the compiler won't issue any warning */
}

编译器无法知道ju的值,因此它正确地警告了隐式类型转换。

关于文件,并引用你的问题:

别警告..。如果值未被转换更改,如"abs (2.0)“中所示。

代码语言:javascript
运行
复制
int foo() {
  return 0UL;
}

这是一个例子,不管涉及的类型如何,值都不会改变。零将永远是零,因为它是intunsigned long类型。

或,

代码语言:javascript
运行
复制
int foo() {
  return 2.0; /* Same case as abs(2.0), an implicit float to int convertion, whose values are not changed by doing so. */
}

因此,基本上,这只适用于文本(例如文档中给出的abs(2.0)示例)。

票数 1
EN

Stack Overflow用户

发布于 2016-07-10 01:06:24

代码语言:javascript
运行
复制
short ki = ju;

落在

可能更改值1的隐式转换。

就可以存储的位数而言,int几乎总是大于short。这是已知的编译时。

值不被转换更改,那么为什么要发出警告呢?

这是你凭直觉得出的结论。这一知识,即使已知需要not2,也要使用编译时。

参考

[1] gcc警告选项。

Note

2编译器不需要跟踪存储在变量中的值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38287363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档