LINUX.ORG.RU

Присвоение массивов в Си

 


0

1

Всегда принимал это как должное, но недавно задумался, а почему собственно нельзя в Си присваивать один массив другому?

То есть почему нельзя сделать так:

int a[10];
int b[10];
a = b;

Однако, если обернуть всё в структуру, то можно так:

struct {int array[10]; } a, b;
a = b;

Сломалось ли бы что-то в языке, если бы присвоение массивов a = b работало как условный memcpy(a, b, sizeof(b)) ?

★★★★★
Ответ на: комментарий от SZT

А как должна выглядеть «неублюдочная запись»?

let a: [10]int;
let b: *[10]int = &a;

В этом же духе массив указателей будет let c: [10]*int. Никаких скобочек, читаем строго слева-направо.

Или как более известно некоторым присутствующим здесь:

let a: [int; 10];
let b: *[int; 10] = &a;
byko3y ★★★★
()
Ответ на: комментарий от byko3y

Или как более известно некоторым присутствующим здесь

Как известно, они все латентные питономакаки, и пердолинг с указателями им не интересен, поэтому в треды про Си они не ходят.

Virtuos86 ★★★★★
()
Ответ на: комментарий от X512

let не нужен

Нужен, когда ты браузишь код в IDE или просто получает ошибку компиляции. Сишную дристню без четкого выраженного синтаксиса очень тяжело парсить даже при ошибке в одном символе. В случае крестов эта проблема еще больше усугубилось, в результате чего чисто синтаксический парсинг крестов невозможен, потому что нельзя отличить шаблонный тип от операторов сравнения и конструктор от объявления функции.

byko3y ★★★★
()
Ответ на: комментарий от byko3y

шаблонный тип от операторов сравнения

Например?

конструктор от объявления функции

Опять же, пример? Конструктор как раз легко отличить по отсутствию типа результата.

anonymous
()
Ответ на: комментарий от byko3y
let a: [10]int;
let b: *[10]int = &a;

Лишь бы на Паскале не писать =)

var
  a:array[10] of integer;
  b:^array[10] of integer = @a;

Правда не помню, можно ли в FreePascal такое присваивание в объявлении сделать, если нет, то b = @a; придется в коде писать. Но все-равно как-то понятнее

praseodim ★★★★★
()
Ответ на: комментарий от anonymous

шаблонный тип от операторов сравнения

Например?

A<B>C;

конструктор от объявления функции

Опять же, пример? Конструктор как раз легко отличить по отсутствию типа результата

A B(C);

Вот еще примеры: https://wiki.sei.cmu.edu/confluence/display/cplusplus/DCL53-CPP. Do not write...

byko3y ★★★★
()
Ответ на: комментарий от anonymous

Severity: low
Likelyhood: unlikely

Это прямо первая хрень, об которую я ударился в крестах, мол «Invalid forward function declaration» — долго думал еще, при чем тут функция вообще, если я конструктор вызываю? Я же ссылку дал — там красивые примеры с фигурными и двойными круглыми скобками для устранения двусмысленности синтаксиса.

byko3y ★★★★
()
Ответ на: комментарий от byko3y

Severity: low

Likelyhood: unlikely

Это прямо первая хрень, об которую я ударился в крестах

Ты как всякие любители плацебо с доказанным отсутствием эффекта. «Ну а вот мне помогло!». Ну помогло так помогло. На общую статистику это не влияет.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.