Инициализация при объявлении переменной против выполнения в отдельных строках в c - PullRequest
0 голосов
/ 05 марта 2019

Обратите внимание, что я выполняю это странное назначение не потому, что мне не ясен синтаксис или я новичок в c.

Я просто пытался выяснить, что произойдет, если int присвоить массив:

int a = {1, 2, 3};

К этому я получил следующее предупреждение:

 warning: excess elements in scalar initializer
  int a = {1, 2, 3};
              ^
warning: excess elements in scalar initializer
  int a = {1, 2, 3};
                 ^

, и когда я печатаю содержимое a, я получаю 1.

Но когда я делаю это:

int a;
a = {1, 2, 3};

Я получаю сообщение об ошибке:

error: expected expression before ‘{’ token
  a = {1, 2, 3};
      ^

Хотя я знаю, что массивы не предназначены для назначения int переменным, приведенные выше результаты приводят меня к вопросу:

  • разница между int x; x = ... и int x = ...

и

  • что именно вызывает предупреждение или сообщение об ошибке?

1 Ответ

0 голосов
/ 05 марта 2019

Прежде всего,

int a = {1, 2, 3};

- это определение и инициализация , а

int a;
a = {1, 2, 3};

- это определение и назначение утверждение.

У них разные правила.Синтаксис {1, 2, 3} называется заключенным в скобки списком инициализатора, который можно использовать в операторе инициализации, а не в присваивании - это синтаксическая ошибка.Итак, это ответит об ошибке во втором фрагменте.

Для первого фрагмента, для скаляра, цитата C11, глава §6.7.9 / P11

Инициализатордля скаляра должно быть одно выражение, необязательно заключенное в фигурные скобки.[...]

Итак, выражение {1, 2, 3} пытается предоставить более одного элемента, который является избыточным.Это то, о чем вас предупреждает ваш компилятор.

...