首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >常量表达式和不可修改的lvalue之间有什么区别?

常量表达式和不可修改的lvalue之间有什么区别?
EN

Stack Overflow用户
提问于 2017-08-14 15:13:54
回答 3查看 689关注 0票数 3

简略地说:

常数表达式 编译器识别源代码中的常量表达式,并用它们的值替换它们。得到的常量值必须在表达式的类型中表示。只要允许使用简单的常量,就可以使用常量表达式。 常量表达式中的运算符受与其他表达式相同的规则约束。但是,由于常量表达式是在翻译时计算的,因此它们不能包含修改变量(例如赋值)的函数调用或操作。

  1. 什么是常量表达?它没有定义常量表达式
  2. 常量表达式和不可修改的lvalue(例如数组名、用const声明的lvalue)之间有什么区别?
  3. 常量表达式总是非值的吗?
  4. 不可修改的lvalue常量表达式吗?
EN

回答 3

Stack Overflow用户

发布于 2017-08-14 15:29:12

  1. 常数表达式在C11 6.6中定义: 描述 2。常量表达式可以在翻译期间而不是运行时进行计算,因此可以在常量可能存在的任何地方使用。 约束条件 3.常量表达式不应包含赋值、增量、递减、函数调用或逗号运算符,除非它们包含在未计算的子表达式中。 4.每个常量表达式应计算为其类型的可表示值范围内的常量。

有几种类型的常量表达式可能允许在一个地方。有一些常量表达式可以计算为

代码语言:javascript
运行
复制
- an arithmetic constant expression,  
    - a special case of this is _integer constant expression_, which is allowed for example as the size of a (statically allocated) array, or a bitfield width.

代码语言:javascript
运行
复制
- a null pointer constant,
- an address constant, or
- an address constant for a complete object type plus or minus an integer constant expression. 

  1. 值或定位器值(可能)指定对象。你可以取一个值的地址。可修改的和不可更改的lvalue之间的区别是,后者不能用作分配的左手边。或者,C11 6.3.2.1p1: 可修改的lvalue是不具有数组类型、不具有不完全类型、不具有const限定类型的lvalue,如果它是一个结构或联合,则没有任何具有const限定类型的成员(递归地包括所有包含的聚合或联合的成员或元素)。

不可修改的lvalue是不可修改的lvalue .

常量表达只是..。值。它们不在内存中--没有42号的地址-- &42是没有意义的。

  1. 因此,常量表达式总是非值的.它们不指定对象。您不能使用6 * 9的地址。
  2. 没有但是..。数组类型的lvalue隐式地衰减为指针到数组,这些是地址常量。然而,当他们被如此转变的时候,他们就不再是价值观了。
票数 4
EN

Stack Overflow用户

发布于 2017-08-14 15:33:30

我认为有不止一个复杂的问题,让我试着用一种简单的方式回答它(主要是通过从标准中明显地复制粘贴,只需自己创建一个重新定位的连接)。

1.常量表达是什么?

C11,第6.5章,Expressions

表达式是一组运算符和操作数,它们指定值的计算,或指定对象或函数,或产生副作用,或执行其组合。

第6.6章,Constant expressions

常量表达式可以在翻译期间而不是运行时进行计算,因此可以在常量可能存在的任何地方使用。

和,P4

每个常量表达式应计算为其类型的可表示值范围内的常数。

对于Lvalues,第6.3.2节,

lvalue是潜在地指定对象的表达式(其对象类型不是void)。

对于对象,§3.15,

对象 执行环境中的数据存储区域,其内容可以表示值。

某些常量表达式(如数组(数组名称)、字符串文本或地址常量)是lvalue。否则,对于所有不可修改的lvalue,由常量对象(或对象引用)和常量表达式组成。

票数 2
EN

Stack Overflow用户

发布于 2017-08-14 15:26:17

常量表达式是在编译过程中已知值(可求值)的表达式。

实例

代码语言:javascript
运行
复制
int a = 5+5+3;  //5 + 5 +3 
char []= "Hello"; // string literal "hello"

不可修改的lvalue是常量对象&常量消耗。

前枫树

代码语言:javascript
运行
复制
const char c;
c = '3';

'3' = c;

可修改的lvalue必须是可寻址的(即您可以使用&获取它们的地址),并且可以分配它们,它们可以位于赋值运算符的左侧。唯一的例外是没有地址的寄存器变量。

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

https://stackoverflow.com/questions/45677712

复制
相关文章

相似问题

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