回复 3楼 无语随风
哦,对确实都是初始化,但不太一样。
第一个利用了初始化的特殊语法,第二个只是比较一般的语法。
比如:
int a[2] = { 0, 1 };
肯定是正确的吧?但是这种语法只用于赋初值,写成下面这样就不行:
int a[2];
a = { 0, 1 };
或者你写成:
a[2] = { 0, 1 };
也不行,反正这种写法是在赋值时方便才用的。
但
int a = 2;
和
int a;
a = 2;
就都可以。
给字符型数组也是相关的初始化语法:
char a[3] = { 'a', 'b', '\0' };
和
char a[3] = "ab";
甚至
char a[] = "ab";
都是一样的作用,这些都是利用了初始化的语法。
如果你不在定义时赋值,那么之后就必须这么写:
a[0] = 'a';
a[1] = 'b';
a[2] = '\0';
所以我认为第一个并不是左值。如果并要说一个,那个字面值也只是读访问,算右值吧。那个数组才是左值。之后你改那个数组和最初的那个"c++"什么的早就没关系了。
而所说的字符串字面值,我觉得理解成一个字符串常量比较好。它成就是一个整体,而且如果是常量肯定也不能更改。
作右值时,(是不是应该理解成)会被自动转换成指针,我觉得也不一定就是const char *,因为很显然不能把 const char * 赋值给 char *。
逻辑上它肯定不能改的,分配给它的内存应该也是只读的。我觉得去更改它倒是也没有语法错误,后来编译试了试,果然编译通过了,执行时才有问题。