【问题标题】:Initialization different from assignment?初始化不同于赋值?
【发布时间】:2013-07-06 07:57:35
【问题描述】:
1.char str[] = "hello"; //legal  

2.char str1[];
str1 = "hello"; // illegal

我知道“hello”从字符串文字池中返回字符串文字的地址,该地址不能直接分配给数组变量。在第一种情况下,“hello”文字中的字符被一个接一个地复制到数组中,并在末尾添加了一个 '\0'。

这是因为赋值运算符“=”在这里被重载以支持这一点吗?

我还想知道初始化不同于赋值的其他有趣案例。

【问题讨论】:

  • 其实char str1[];也是非法的。
  • @banarun 是的,你是对的。我们需要声明数组的大小。

标签: c initialization assignment-operator


【解决方案1】:

不能将其视为重载(无论如何在 C 中都不存在),因为使用字符串文字初始化 char 数组是一种特殊情况。字符串字面量的类型是const char[N],因此如果它类似于重载,则可以使用任何类型为const char[N] 的表达式来初始化字符数组。但你不能!

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

与结构相同

【讨论】:

    【解决方案2】:

    如果您想将其视为被重载的运算符(即使 C 不使用该术语),您当然可以这样做。

    您是否也认为这是重载:

    unsigned char x;
    double y;
    
    x = 2;
    y = 1.243;
    

    毕竟,它们分配了完全不同类型的数据,但使用的是“相同的运算符”,对吧?

    只是不同,是初始化还是赋值。

    另一个很大的不同是你曾经能够初始化结构,但是没有对应的“结构文字”语法用于以后的赋值。从 C99 开始,这不再适用,我们现在有 compound literals

    【讨论】:

    • 您能否给我其他一些初始化不同于基本数据类型赋值的实例?
    • @NithishInpursuitOfhappiness struct 是又一个这样的例子:struct x { int a; char c; } a = {1, '1'}; 是有效的,但以后你不能这样做 a = {2, '1'};
    • @GrijeshChauhan 你看了我的回答了吗?在 C99(这并不是真正的新功能)中,您肯定可以做到:a = ((struct x) { 2, 'a' });
    • 现在再读一遍,可以像 int a[] = {1,2,3} 这样分配数组,然后在我的代码 a = (int[3]){3,2,1}; 在 c99 中分配数组??
    【解决方案3】:
    char str[] = "hello";
    

    是数组初始化,使用C中定义的语法糖,因为字符串初始化是如此普遍。编译器在您的程序中分配一些固定内存并对其进行初始化。数组 (str) 的名称计算为该内存的地址,并且无法更改,因为没有保存该地址的变量。

    Grijesh Chauhan 解释了更多细节。

    其他情况取决于您的意思。扩展目前的情况,可以很容易看到其他初始化的数组也有相同的属性,例如

    int a[] = { 1, 2, 3, 4 };
    

    【讨论】:

    • 感谢感谢,但知道我删除了我的答案,因为我认为数组寻找其他初始化示例,这些在分配中无效,根据标题回答
    【解决方案4】:

    数组有不可修改的地址。您需要一个指针作为可修改的左值。

    通过分配(尝试)给一个持续的字符串文字,您正在获取它的地址。不同的地址导致了这种非法性。

    “hello”在内存中分配一些空间并给出地址。然后你把它的地址初始化数组。

    【讨论】:

      猜你喜欢
      • 2014-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-19
      • 2011-03-14
      • 1970-01-01
      • 2013-05-07
      • 2014-11-20
      相关资源
      最近更新 更多