1.char str[] = "hello"; //legal 2.char str1[]; str1 = "hello"; // illegal
我知道“hello”从字符串文字池中返回字符串文字的地址,该地址不能直接分配给数组变量。 在第一种情况下,将“hello”文字中的字符逐个复制到数组中,并在末尾添加“ 0”。
这是因为赋值运算符“=”在这里被重载以支持这个吗?
我还想知道其他有趣的情况,其中初始化与赋值不同。
您不能将其视为重载(无论如何都不存在于C中),因为使用字符串文字初始化char数组是一种特殊情况。 字符串文字的类型是const char[N]
,因此如果它类似于重载,您将能够使用类型为const char[N]
任何表达式初始化char数组。 但你不能!
const char arr[3]; const char arr1[] = arr; //compiler error. Cannot initialize array with another array.
语言标准只是说字符数组可以用字符串文字初始化。 由于他们对分配没有任何说明,因此一般规则尤其适用于无法分配数组。
至于初始化与赋值不同的其他情况:在C ++中,有引用和类,会有数以万计的例子。 在C中,没有完整的类或引用,我能想到的另一件事就是const变量:
const int a = 4; //OK; const int b; //Error; b = 4; //Error;
另一个例子:用大括号进行数组初始化
int a[3] = {1,2,3}; //OK int b[3]; b = {1,2,3}; //error
与结构相同
如果您想将其视为操作符过载(即使C不使用该术语),您当然可以这样做。
你还认为这是重载:
unsigned char x; double y; x = 2; y = 1.243;
毕竟,那些分配完全不同类型的数据,但使用“相同的运算符”,对吧?
它只是与初始化或分配不同。
另一个很大的区别是你曾经能够初始化结构,但是后来的赋值没有相应的“struct literal”语法。 从C99开始,这已不再适用,我们现在有了复合文字 。
char str[] = "hello";
是数组初始化,使用C中定义的语法糖,因为字符串初始化是如此常见。 编译器在程序中分配一些固定内存并对其进行初始化。 数组(str)的名称计算为此内存的地址,并且无法更改,因为没有包含该地址的变量。
Grijesh Chauhan解释了更多细节。
其他情况取决于你的意思。 例如,扩展当前案例,您可以轻松地看到其他已初始化的数组具有相同的属性
int a[] = { 1, 2, 3, 4 };
数组具有不可修改的地址。 你需要一个指针作为可修改的左值。
通过分配(尝试)一个不变的字符串文字,你将获取它的地址。 不同的地址导致非法。
“hello”在内存中分配一些空间并给出和解决。 然后你拿它的地址来初始化数组。
以上就是c/c++开发分享初始化与赋值不同?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/559605.html