2016-08-30 12 views
1

Можем ли мы определить структурную переменную после ее объявления или определения за один раз? Все вместе в одиночные скобки, какВыполнение структурной переменной инициализации/определения за один проход после объявления переменной

asd = {21,'H'}; 

Любая конкретная причина, если она не может быть сделано, так как оно может быть определено в той же строке, где он был объявлен т.д .: struct asd = {21,'H'};?

struct test 
{ 
    int a; 
    char b; 
}asd; 

asd = {21,'H'}; // error: expected an expression 

Запрошено программирование на языке C.

+0

Поскольку агрегатная инициализация отличается от назначения. –

+0

fyi: 'auto asd = {21, 'H'};' не работает. 'auto asd = {21,22};' компилируется, но не делает того, о чем вы просите. –

+6

Не могли бы вы выбрать язык, пожалуйста. c не C++ не c. –

ответ

0

Явное приведение типа требуется:

struct test 
{ 
    int a; 
    char b; 
} asd; 

asd = (struct test){21,'H'}; 

Этот код примерно эквивалентно следующему:

const struct test initialiser = {21,'H'}; 
... 
asd = initialiser; 

Разница заключается в том, что компилятор имеет возможность оптимизировать присвоение значение переменной asd с использованием инструкций ассемблера с непосредственными значениями, когда такая оптимизация более эффективна, чем инициализация копии структуры const.

Как эффект «на стороне» этот синтаксис действует в обоих C и C++

+0

@ 2501 Я не знал, что у него есть определенное имя. Не могли бы вы рассказать мне, пожалуйста? – Serge

+0

@nathanoliver 1. Можно ли сделать одно и то же для struct asd [5]; после его объявления? Не как * (asd + 3) = (struct tt) {-2, '\ 0'}; Но для всех элементов массива, как в одной строке. 2. Могут ли все обычные массивы, подобные intry [5] = {1,22,31,231,5}; может быть сделано после его объявления? например: ary = (int) {1,22,31,231,5}; – Lpdnn

+0

@Lpdnn unfortunatelly no, массивы не могут быть назначены таким образом. Единственным обходным решением является создание массива как члена структуры; – Serge

0
struct test 
{ 
    int a; 
    char b; 
}asd; 

Является ли определение structtest и переменной asd типа test. На ; теперь у вас есть построенный по умолчанию объект с именем asd. При попытке сделать

asd = {21, 'H'}; 

Вы пытаетесь присвоить asd и приготовился список, который не будет работать, так как он не имеет оператор присваивания, который принимает список инициализации.

Вы можете инициализировать asd при объявлении его как

struct test 
{ 
    int a; 
    char b; 
}asd = {21, 'H'}; 

или выполнить задание, как

asd = (struct test){21, 'H'}; 

Если вы решили использовать назначение не отметить, что это должно быть сделано внутри функции а не в глобальном пространстве.

+0

Задача должна быть главной, так как в противном случае вы получите эту ошибку: 'error: 'asd' не называет тип –

+0

@ArnavBorborah Добавлено об этом. – NathanOliver

+0

@Lpdnn Я использовал синтаксис C++. Я обновил ответ с помощью синтаксиса C. – NathanOliver

0

Как @CaptainOblivious упоминалось:

–aggregate initialization is different from assignment.

Что это означает, что вы не можете использовать агрегатную инициализацию присваивание для агрегатных объектов позже, без явного или отдельно, например:

struct test 
{ 
    int a; 
    char b; 
}asd; 
int main() {asd.a = 21; asd.b = 'H'} 

Альтернативная вещь может быть явной позже (это необходимо сделать в основном или в другом блоке кода или получить ошибку (asd does not name a type)):

asd = test{21,'H'} 

Другая вещь, которую вы можете сделать это:

struct test 
{ 
    int a; 
    char b; 
}asd = {21,'H'}; 

Оба выше будет работать так же, как показано здесь: Live Example

-1

Если вы определяете переменную этого типа вы должен содержать часть struct, например struct asd. Но это определение и инициализация все вместе прекрасно работают.

struct test 
{ 
    int a; 
    char b; 
} asd = { 21, 'H'}; 
+0

OP спросил, можно ли сделать определение и intialisation за один раз, и мой ответ показывает, что он может. Спасибо за прекрасный downvote. Если вы знаете лучше, пожалуйста, поделитесь своими знаниями, поэтому мы можем все выиграть. –

 Смежные вопросы

  • Нет связанных вопросов^_^