c/c++语言开发共享初始化与赋值不同?

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

      (0)
      上一篇 2021年1月27日
      下一篇 2021年1月27日

      精彩推荐