【问题标题】:Assign an array of int (only one element) to an integer in c将 int 数组(只有一个元素)分配给 c 中的整数
【发布时间】:2017-01-02 20:37:10
【问题描述】:

我在一个网页上看到我们可以这样做:

int k = {5};

当我自己尝试时,我发现这在 C 编程中有效,k 的值是5

  • q1:为什么我们可以将一个整数数组(即使只有一个元素)分配给一个整数类型的变量,不应该有一些错误?
  • q2:这种类型的分配用于什么? (在哪种情况下以及我们为什么使用它,或者我们可能不再使用它?)

【问题讨论】:

  • 为什么你认为{5} 是一个元素的数组?为什么它不能是一个等于五的元素的结构副本?其原因是历史性的。这是K&R的编译器允许的。
  • 顺便说一句,这不是分配类型。它是带有初始化器的声明

标签: c syntax variable-assignment


【解决方案1】:

没有数组,C 语法简单地允许这样做。这两个是等价的:

int k = 5;
int k = {5};

如初始化的语法规则中所见1
初始化器可以是一个赋值表达式,对应于:

int k = 5;

初始化器也可以是{initializer-list},可以是初始化器,也可以是赋值表达式:

int k = {5};

1(引自 ISO/IEC 9899:201x 6.7.9 初始化语法 1。)
初始化器:
赋值表达式
{ 初始化列表 }
{ 初始化列表 , }

初始化列表:
指定 opt 初始化程序
initializer-list , 指定 opt 初始化器

【讨论】:

    【解决方案2】:

    int k = {5}; 是初始化标量的完全合法的方式,尽管它并不能很好地表达您的意图。因此,一个好的编译器可能会警告你。

    但请注意,将大括号初始化为零{0} 是惯用的。 (虽然在 C++ 中,我更喜欢使用{})。

    【讨论】:

    • 但我使用gcc 和选项-Wall 但没有警告。
    • 哼,它确实用过来警告你。我想知道他们是否关闭了警告,因为太多人抱怨它警告{0}
    • @Bathsheba 如果定义完美,为什么会发出警告?也许你使用了 C++ 编译器,或者一些不起眼的标志?
    • “这并不能很好地表达你的意图”
    • 如果意图是初始化一个变量,那么这两个变体都可以很好地表达它。
    猜你喜欢
    • 2013-04-09
    • 2021-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    相关资源
    最近更新 更多