简略地说:
常数表达式 编译器识别源代码中的常量表达式,并用它们的值替换它们。得到的常量值必须在表达式的类型中表示。只要允许使用简单的常量,就可以使用常量表达式。 常量表达式中的运算符受与其他表达式相同的规则约束。但是,由于常量表达式是在翻译时计算的,因此它们不能包含修改变量(例如赋值)的函数调用或操作。
const声明的lvalue)之间有什么区别?发布于 2017-08-14 15:29:12
有几种类型的常量表达式可能允许在一个地方。有一些常量表达式可以计算为
- 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.
- a null pointer constant,
- an address constant, or
- an address constant for a complete object type plus or minus an integer constant expression.
不可修改的lvalue是不可修改的lvalue .
常量表达只是..。值。它们不在内存中--没有42号的地址-- &42是没有意义的。
6 * 9的地址。发布于 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,由常量对象(或对象引用)和常量表达式组成。
发布于 2017-08-14 15:26:17
常量表达式是在编译过程中已知值(可求值)的表达式。
实例
int a = 5+5+3; //5 + 5 +3
char []= "Hello"; // string literal "hello"不可修改的lvalue是常量对象&常量消耗。
前枫树
const char c;
c = '3';
'3' = c;可修改的lvalue必须是可寻址的(即您可以使用&获取它们的地址),并且可以分配它们,它们可以位于赋值运算符的左侧。唯一的例外是没有地址的寄存器变量。
https://stackoverflow.com/questions/45677712
复制相似问题