代码之家  ›  专栏  ›  技术社区  ›  EvilTeach

char four[4]=“四”;这个语句的正确语义是什么?

  •  7
  • EvilTeach  · 技术社区  · 15 年前
    int main(void)
    {
        char four[4] = "four";
        return 0;
    }
    

    编译为C++程序时,G++报告

    当编译一个C程序时,GCC不会报告任何错误。

    在我看来,赋值正确地将所有4个字节复制到变量中,正如我所期望的那样。

    在C中观察到的行为是正确的还是我接触到了某个未定义的行为, 或者是别的什么东西?

    4 回复  |  直到 15 年前
        1
  •  22
  •   Carl Norum    15 年前

    简短的回答:你的代码是有效的C,但不是有效的C++。

    长话短说:

    "four" \0 为您添加。在节中 6.7.8初始化

    字符类型的数组可以由字符串文字初始化,也可以用大括号括起来。字符串文本的连续字符(如果有空间或数组大小未知,则包括终止的空字符)初始化数组的元素。

    所以 \0 明确地 8.5.2字符数组 ,第2段):

    初始值设定项不得多于数组元素。[

    char cv[4] = "asdf";  // error
    

    ’\0’ . 结束示例

        2
  •  2
  •   fizban    15 年前

    字符串“four”实际上包含五个字节:四个字母加一个零字节(\0)作为字符串终止符。我写C或C++已经有一段时间了,但是我猜想C编译器不管什么原因都会默默地忽略它。

        3
  •  2
  •   Jeff Walker    15 年前

    最好是

    char four[] = "four";
    
        4
  •  1
  •   Jerry Coffin    15 年前

    必须