首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >文字数字被视为常量吗?

文字数字被视为常量吗?
EN

Stack Overflow用户
提问于 2010-08-07 23:37:54
回答 4查看 504关注 0票数 0

对于像PI这样的contants来说,更好的方式是#定义它们或将它们声明为const,这样编译器就可以优化,变得不太容易出错。然而,我想知道,语句中的文字数字是如何处理的?例如:

代码语言:javascript
运行
AI代码解释
复制
float x;
const int y = 60;
x = y / 3.0f;

在这个例子中,3.0f是如何处理的?它会继承常量的优化吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-08-07 23:43:55

将发生什么优化取决于编译器。在您的例子中,C和C++编译器通常都有足够的信息将您的源代码优化为相同的机器代码。换句话说,它实际上并不太依赖于这段代码中的文字和常量。

话虽如此,在C和C++中,文字和常量这两个术语的含义有很大的不同(并且您同时标记了问题C和C++ )。

C中的

  • 60是常量,但y不是常量。如果愿意,可以将y称为常量限定变量,但在C术语中它不是常量,因为单个y在C中不是常量表达式。

至于字面量,在C语言中,字面量这个术语只适用于字符串字面量(在C99中也适用于复合字面量),也就是说,你的代码中根本没有字面量。

C++中的

  • 603.0.f都是文字,它们形成常量表达式(分别是整型和浮点型-point )。y也是int类型的常量,从某种意义上说,单个y是C++中的常量表达式。

您可能注意到差异的情况与优化无关,而是与语言的定义方式有关。例如,在C++中,在文件范围数组类型声明中使用上述y是合法的,但在C++中则不合法

代码语言:javascript
运行
AI代码解释
复制
 typedef int int_array[y]; /* OK in C++, ERROR in C */
票数 10
EN

Stack Overflow用户

发布于 2010-08-07 23:41:20

由于您使用#define请求预处理器进行文本替换,因此您的代码与以下代码相同:

代码语言:javascript
运行
AI代码解释
复制
#define VAL 3.0f

float x;
const int y = 60;
x = y / VAL;

如何优化直接常量值显然取决于编译器。但是,如果您仔细观察汇编代码(例如,由gcc编写的汇编代码),就会注意到编译器直接写入浮点标准中编码3.0的二进制序列。

票数 1
EN

Stack Overflow用户

发布于 2010-08-08 00:24:55

在某些架构上,可以直接使用的字符串大小是有限制的。当字符串文字的大小太大时,编译器需要将常量存储在只读数据内存中的某个位置,然后在需要时从内存中加载值。

如果将值存储在常量变量中,则编译器很有可能只存储常量的一个值并适当地使用。然而,如果一个#定义了常量,这只会使预处理器将文字值放入代码中,因此编译器有可能没有意识到您正在使用相同的值并多次存储常量。正因为如此,常量变量比#定义变量更好。

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

https://stackoverflow.com/questions/3432478

复制
相关文章

相似问题

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