C 常量表达式和不可修改的左值之间有什么区别?
简而言之,从C开始: 常量表达式 编译器识别源代码中的常量表达式 并用它们的值替换它们。得到的常量值 必须在表达式的类型中表示。您可以使用常量 表达式,只要允许使用简单常量 运营商 常量表达式遵循与其他表达式相同的规则 表达。因为常量表达式是在转换时计算的 但是,时间不能包含 修改变量,例如赋值C 常量表达式和不可修改的左值之间有什么区别?,c,C,简而言之,从C开始: 常量表达式 编译器识别源代码中的常量表达式 并用它们的值替换它们。得到的常量值 必须在表达式的类型中表示。您可以使用常量 表达式,只要允许使用简单常量 运营商 常量表达式遵循与其他表达式相同的规则 表达。因为常量表达式是在转换时计算的 但是,时间不能包含 修改变量,例如赋值 什么是常量表达式?它不定义常量表达式 常量表达式和不可修改的左值(例如数组名、已用const声明的左值)之间有什么区别 常量表达式总是非左值吗 不可修改的左值是常量表达式吗 常量表达式是编译期间
const
声明的左值)之间有什么区别
常量表达式是编译期间已知(可以计算)值的表达式 埃克斯枫树
int a = 5+5+3; //5 + 5 +3
char []= "Hello"; // string literal "hello"
不可修改的左值是不变的对象和不变的支出
枫树
const char c;
c = '3';
'3' = c;
可修改左值必须是可寻址的(即您可以使用&)和可赋值的(即它们可以位于赋值运算符的左侧)。唯一的例外是没有地址的寄存器变量
什么是常量表达式
§6.6-常数表达式:
常量表达式可以在转换过程中而不是在运行时进行计算,因此可以在常量所在的任何位置使用
常量表达式的约束之一是
常量表达式不得包含赋值、递增、递减、函数调用或逗号运算符,除非它们包含在未计算的子表达式中115)
常量表达式和不可修改的左值之间有什么区别 不可修改的左值不是常量表达式不可修改的值是不能用于修改对象的左值
int const i = 5;
i
指的是常量对象,但它是一个左值,一种特殊的左值,称为不可修改左值
无论标准在哪里提到“左值”,它实际上意味着“可修改的左值”(为了清晰起见,您在标准中找不到这一点)
现在让我再解释一下
int x = 5;
int const *p;
x
是一个非常量对象,是一个可修改的左值p
是指向const int
对象的指针
p = &x; // This will raise a warning though and hazardous to do.
上述赋值使用限定转换将指向int
的指针类型的值转换为指向const int
的指针类型的值*p
和x
是指同一对象的两个不同表达式。可以使用x
--x;
但是这不能用*p
来完成,因为它是不可修改的左值
--(*p); // Error
常量表达式和不可修改的左值之间的另一个区别是
int const x = 5;
int *p;
/* Assigning address of a non-modifiable object */
p = &x // Correct
/* Assigning address of a constant expression */
p = &5 // Wrong
常量表达式总是非左值吗
是的,常量表达式总是非左值,即右值
不可修改的左值是常量表达式吗
否
常量表达式不得包含赋值、递增、递减、函数调用或,除非它们包含在未计算的子表达式中。115) 每个常数表达式应计算为其类型的可表示值范围内的常数 有几种类型的常量表达式可以在一个位置中使用。存在计算为的常量表达式
- 一个算术常数表达式,
- 这种情况的一个特例是整数常量表达式,例如允许作为(静态分配的)数组的大小或位字段宽度
- 一个空指针常量
- 地址常量,或
- 完整对象类型的地址常量加上或减去整数常量表达式李>
&42
没有意义6*9
的地址我认为有不止一个复杂的问题,让我试着用一种简单的方式来回答它(主要是通过公然复制粘贴标准,只是自己创建一个保留连接) 一,。什么是常量表达式
C11
,第§6.5章,表达式
<