VSE0028
code
c
#include <stdio.h>
int main(int argc, char* argv[])
{
const int N = 10;
char arr[N] = { 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l' };
return 0;
}
vs: E0028 表达式必须含有常量zhi

const 为什么不是你想的那种"常量" / Why const is not the constant you expect
English: const means read-only through this name , not "this is a compile-time constant expression."
中文: const 的含义是**"通过这个名字不能改"**,不是"它一定是编译期常量表达式"。
That is the core of the confusion.
为什么中文更容易误解 / Why Chinese wording is confusing
English: In Chinese, people often say "const 是常量". That is a simplified classroom说法, but it is not precise enough for compiler rules.
中文: 中文里常说"const 是常量",这是一种教学上的简化说法,但对编译器规则来说不够精确。
English: More accurate Chinese is: const 是"常量限定的对象"或"只读对象".
中文: 更准确地说,const 是"带常量限定的对象"或者"只读对象"。
英文里怎么说更准确 / More precise English terms
English: The important terms are:
- const-qualified object
- constant expression
- integer constant expression
中文: 英文里要区分这几个术语:
- const-qualified object :带
const限定的对象 - constant expression:常量表达式
- integer constant expression:整数常量表达式
English: const int N = 10; gives you a const-qualified object, but not necessarily an integer constant expression.
中文: const int N = 10; 只是得到一个 const 限定对象,但不一定得到整数常量表达式。
C 里两种"常量"容易混 / Two meanings of "constant" in C
| English | 中文 |
|---|---|
const int N = 10; |
只读对象 / read-only object |
10 |
字面量 / literal |
#define N 10 |
预处理宏,编译前替换 / preprocessor macro |
enum { N = 10 }; |
真正可用于常量表达式的整型常量 / true integer constant |
constexpr |
C 里没有,C++ 才有 / not in C, only in C++ |
你的这段代码在 C 和 C++ 的区别 / C vs C++ difference
在 C 里 / In C
English: char arr[N]; is invalid because N is not an integer constant expression.
中文: char arr[N]; 在 C 里通常不合法,因为 N 不是整数常量表达式。
在 C++ 里 / In C++
English: const int N = 10; at block scope can be used as an array bound in many cases.
中文: 在 C++ 里,块作用域的 const int N = 10; 很多情况下可以直接作为数组长度。
English: So if you saw different behavior in C and C++, that is normal.
中文: 所以你如果在 C 和 C++ 里看到不同行为,这是正常的。
这不是中文翻译"完全错了",但确实不严谨 / The translation is not totally wrong, but it is imprecise
English: "const is a constant" is a shortcut, not a full compiler-level definition.
中文: "const 是常量"是个快捷说法,不是完整的编译器级定义。
English: The compiler error is talking about constant value in the language grammar/semantics , not just "read-only" semantics.
中文: 编译器报错说的"常量值",指的是语言语义里的常量表达式,不是简单的"只读"。
你该怎么改 / How to fix it
方案 1:直接写字面量 / Use a literal directly
c
char arr[10] = { 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l' };
方案 2:用宏 / Use a macro
c
#define N 10
char arr[N] = { 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l' };
方案 3:用枚举常量 / Use an enum constant
c
enum { N = 10 };
char arr[N] = { 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l' };
English: In C, enum { N = 10 }; is a very common way to define a compile-time integer constant.
中文: 在 C 里,enum { N = 10 }; 是定义编译期整数常量的常见方式。
多义混乱-- const and constant
按"中文常量 / 英文 constant / C 和 C++ 里的精确定义 "分开讲。
I'll break this down by Chinese "常量" , English "constant" , and the precise meanings in C and C++.
1) 总观点 / Big picture first
English: In programming, "constant" is an overloaded word. In Chinese, "常量" is also overloaded. They do not always refer to the same thing.
中文: 在编程里,constant 这个词是一词多义 的;中文里的"常量"也是一词多义的。它们并不总是指同一个东西。
English: The main source of confusion is that people often use "constant" to mean at least four different things: a literal, a const-qualified object, a compile-time constant expression, or an immutable value in a broader sense.
中文: 混乱的根源在于:人们常常用"常量"来指至少四类东西:字面量 、const 限定对象 、编译期常量表达式、以及更宽泛的"不可变值"。
2) 核心对照表 / Core mapping table
| English | 中文 |
|---|---|
| literal | 字面量,源码里直接写出来的值 |
| const-qualified object | const 限定对象 / 只读对象,不能通过该名字修改 |
| constant expression | 常量表达式,在编译期可求值 |
| integer constant expression | 整数常量表达式 ,C 里数组长度、case 标签等常常要求它 |
| compile-time constant | 编译期常量,口语化说法,具体要看上下文 |
| immutable value | 不可变值,更偏概念,不一定是语言规则术语 |
English: These are related, but not equivalent.
中文: 这些概念有关联,但不等价。
3) 中文"常量"常见简化说法 vs 完整含义 / Simplified Chinese usage vs precise meaning
A. "const 是常量"
English: This is a common classroom shortcut, but it is not precise.
中文: 这是很常见的课堂简化说法,但不够精确。
English: More precise: const means the object is not modifiable through that name.
中文: 更精确地说:const 表示"通过这个名字不能修改这个对象"。
B. "const int N = 10; 是常量"
English: In C, this is often misleading. It is a const-qualified object, but not necessarily a constant expression.
中文: 在 C 里,这种说法很容易误导。它是一个 const 限定对象,但不一定是常量表达式。
English: In C++, this may be usable in more compile-time contexts, but still should not be casually equated with every kind of "constant."
中文: 在 C++ 里,它在更多编译期场景下可用,但也不能随便把它和所有"常量"混为一谈。
C. "字面量也是常量"
English: Yes, in a broad sense, a literal like 10 is a constant value.
中文: 是的,广义上说,10 这种字面量确实是常量值。
English: But in compiler terms, "literal" and "constant expression" are different concepts.
中文: 但在编译器术语里,"字面量"和"常量表达式"是不同概念。
4) 英文里的相关表述 / English terms and what they really mean
| English term | Common Chinese simplification | Precise meaning | Typical pitfall |
|---|---|---|---|
constant |
常量 | 可能指很多东西 | 太宽泛,容易混淆 |
literal |
字面量 | 源码中直接写出的值 | 被误叫成"常量变量" |
const |
常量 | const-qualified / read-only object | 误以为一定可用于编译期常量场景 |
constant expression |
常量表达式 | 编译期可求值的表达式 | 和 const 混淆 |
integer constant expression |
整数常量表达式 | C 里的严格编译期整数常量 | 数组长度、case 相关 |
compile-time constant |
编译期常量 | 口语化说法 | 不是所有语言都有统一严格定义 |
English: So the English side is not "more exact by itself"; it just has more precise vocabulary available.
中文: 所以英文并不是天然更精确,而是可用的术语更细,更容易把问题拆开。
5) C 和 C++ 的差异 / Differences between C and C++
In C
English: const int N = 10; means a const-qualified object. It is not generally an integer constant expression.
中文: 在 C 里,const int N = 10; 只是一个 const 限定对象,通常不是整数常量表达式。
English: That is why it may not be accepted where a compile-time constant is required, such as array sizes in old-style C contexts or case labels.
中文: 这就是为什么它在某些必须是编译期常量的地方会不被接受,比如某些 C 场景下的数组长度、case 标签等。
In C++
English: const int N = 10; is much more powerful in constant-expression contexts, but still not identical to constexpr.
中文: 在 C++ 里,const int N = 10; 在常量表达式场景下要强得多,但它仍然不等于 constexpr。
English: constexpr is the explicit language feature for compile-time constants.
中文: constexpr 才是 C++ 里明确用于"编译期常量"的语言特性。
6) 最容易混淆的几个问题 / The most common confusions
1. const 是否等于"编译期常量"?
English: No. const means read-only through that name; compile-time constant is a different concept.
中文: 不等于。const 表示"通过该名字只读";编译期常量是另一个概念。
2. 字面量是否就是 const?
English: No. A literal like 10 is not a const object. It is a literal value in the source code.
中文: 不是。10 这种字面量不是 const 对象,它只是源码中的一个字面值。
3. const 变量能不能当数组长度?
English: In C, usually no for compile-time constant contexts. In C++, often yes in more cases, but constexpr is the clean solution.
中文: 在 C 里通常不行;在 C++ 里更多情况下可以,但最干净的做法仍然是 constexpr。
4. "常量"是不是"不能变"?
English: Not always. In C/C++, const prevents modification through a specific access path, but the object may still exist in memory and may be altered by undefined behavior if you violate the rules.
中文: 也不完全是。C/C++ 里的 const 只是阻止你通过某条访问路径修改它,但对象可能仍然存在于内存中,若你绕过规则强改,可能导致未定义行为。
7) 一个非常实用的分辨框架 / A practical framework
你以后遇到"常量"时,先问这四个问题。
When you see "constant," ask these four questions first.
| Question | English | 中文 |
|---|---|---|
| 1 | Is it a literal in source code? | 它是不是源码里的字面量? |
| 2 | Is it a const-qualified object? |
它是不是 const 限定对象? |
| 3 | Is it a compile-time constant expression? | 它是不是编译期常量表达式? |
| 4 | Is it only conceptually immutable, but not a language constant? | 它是不是只是概念上的"不可变",但不是语言常量? |
English: This framework prevents most misunderstandings.
中文: 这个框架可以挡住大多数误解。
8) 典型例子 / Typical examples
c
const int a = 5; // English: const-qualified object
// 中文:const 限定对象 / 只读对象
int b = 5; // English: variable initialized with literal 5
// 中文:用字面量 5 初始化的变量
#define N 5 // English: macro replacement, not a typed object
// 中文:宏替换,不是有类型的对象
enum { M = 5 }; // English: integer constant in C, often usable in constant-expression contexts
// 中文:C 里的整数常量,常可用于常量表达式场景
English: These four look similar in casual talk, but they are not the same thing at all.
中文: 这四个在口语里看着都像"常量",但本质上完全不是一回事。
9) 我对这个问题的看法 / My view
English: The biggest problem is not the language, but the habit of using one word for multiple layers of meaning.
中文: 最大的问题不是语言本身,而是我们习惯用一个词去指代多个层次的东西。
English: For learning, it is better to separate three layers:
- source-code notation,
- object/property in the language,
- compile-time evaluability.
中文: 学习时最好分成三层: - 源码写法;
- 语言里的对象/属性;
- 是否能在编译期求值。
English: If you keep these three layers separate, many "why is const not constant?" questions disappear.
中文: 只要把这三层分开,很多"为什么 const 不是常量"的问题就会自动消失。
10) 最后的建议 / Final advice
English: When you write or read documentation, prefer precise wording:
- "literal"
- "const-qualified object"
- "constant expression"
- "integer constant expression"
constexprin C++
中文: 你在写文档或者看资料时,尽量使用更精确的词:- "字面量"
- "const 限定对象"
- "常量表达式"
- "整数常量表达式"
- C++ 里的
constexpr
English: Avoid using "constant" alone unless the context is already clear.
中文: 除非上下文已经非常清楚,否则尽量不要只说"常量"这一个词。