Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Borkot
4 / 4 / 0
Регистрация: 05.05.2012
Сообщений: 183
Записей в блоге: 1
#1

уточнение по Объеденениям - C++

18.09.2012, 12:15. Просмотров 289. Ответов 1
Метки нет (Все метки)

Прочитал на http://programmersclub.ru/19/, что Объединения хранят инфу только для одного элемента в данный момент времени, но зделав один пример в Визуал студио 2010 это не совсем так.
Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
#include<stdlib.h>
using namespace std;
 union proba
 {
    short k[10];
    int t[5];
 }vove;
 
int main()
{
    int a=352,b=22;
    proba m;
    for(int i=0;i<10;i++)
    {
        if(i<5)
        {
            m.k[i]=a;vove.t[i]=b;
            a++;b++;
        }
        else
        {
            m.k[i]=a;
            a++;
        }
    }
    cout<<sizeof(m.k)<<'\n';
    cout<<sizeof(vove.t)<<'\n';
    cout<<sizeof(proba)<<'\n';
    cout<<m.k[0]<<"  "<<vove.t[4]<<'\n';
    for(int i=0;i<10;i++)
    {
        if(i<5)
        {
            cout<<m.k[i]<<"  "<<vove.t[i]<<'\n'; 
        }
        else
        {
            cout<<m.k[i]<<'\n';
        }
    }
    return 0;
}
Вопрос почему если объединение хранит только один элемент в данный момент времени,у меня после записи всех элементов,они также продолжают там храниться?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.09.2012, 12:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос уточнение по Объеденениям (C++):

Уточнение по С++11 - C++
Читаю Страуструпа по С++11. Там приведены 2 примера, которые я хочу уточнить. class X2 { X2&amp; operator=(const X2&amp;) =...

Уточнение по коду - C++
Что возвращает эта строка, если массивы double значений: s = s | s]; Добавлено через 1 час 8 минут Я прошу это уже 3 дня, что,...

Небольшое уточнение - C++
Дан массив. в нем выполняется поиск элемента последовательным или бинарным методами (в зависимости от заданных параметров). вот код полной...

Абстрактный класс, уточнение - C++
Йеп. Интересует вот что: Нужно создать абстрактный класс Издание, где будет хранится название и цена книги. Наследуются класс -- Книги,...

Уточнение корня уравнения - C++
Условие к программе: Уточнение корня уравнения sin^2*x+a*sin*x-b=0

Уточнение о полях структуры - C++
Подскажите, пожалуйста, почему у меня не видны поля структуры ? Мне кажется, я где-то неправильно обращаюсь к структуре, но не знаю, как...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Toshkarik
1140 / 857 / 51
Регистрация: 03.08.2011
Сообщений: 2,384
Завершенные тесты: 1
18.09.2012, 12:49 #2
Вы видать не до конца поняли структуру объединений.
Предположим, мы объявили такое объединение:
C++
1
2
3
4
union myUnion {
   unsigned int a;            //предположим, что int на используемой платформе 4 байта
   unsigned short int b;   //предположим, что short int на используемой платформе 2 байта
};
Объекты данного объединения будут иметь одно поле размером 4 байта.
Попробуем теперь создать объект данного объединения и присвоим полю с именем a значение 32768.
C++
1
2
3
4
5
myUnion obj;
 
obj.a = 32768;
 
std::cout << obj.a << ' ' << obj.b << std::endl; // тут у нас выведется 32768 32768
В данном случае поле будет выглядеть в двоичном представлении так:
0000 0000 0000 0000 1000 0000 0000 0000

Теперь присвоим полю с именем a значение:

C++
1
2
3
obj.a = 65536;
 
std::cout << obj.a << ' ' << obj.b << std::endl; // тут у нас выведется 65536 0
В данном случае поле будет выглядеть в двоичном представлении так:
0000 0000 0000 0001 0000 0000 0000 0000

Ну а теперь присвоим полю с именем a значение 98304:
C++
1
2
3
obj.a = 65536;
 
std::cout << obj.a << ' ' << obj.b << std::endl; // тут у нас выведется 98304 32768
В данном случае поле будет выглядеть в двоичном представлении так:
0000 0000 0000 0001 1000 0000 0000 0000

Теперь объяснение: размер поля объектов объединений равен максимальному размеру из объявленных в нем типов, и все объекты его разделяют. Для представленного мной объединения в качестве примера, получается вот такая схемка.
Код
                     __________________
                    |unsigned short int|
0000 0000 0000 0001 1000 0000 0000 0000
|______________________________________|
            unsigned int
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.09.2012, 12:49
Привет! Вот еще темы с ответами:

Уточнение о геттере в классе Строка - C++
Подскажите, пожалуйста, как правильно должен быть реализован такой геттер ? class String { private: char* str; int length; ...

Уточнение как работает getchar(); - C++
Я ввёл 4 символа в оператор getchar(); и нажал &lt;Enter&gt;. Количество введённый символов получается 5? В смысле &lt;Enter&gt; это же символ...

Уточнение о том как работает оператор for - C++
Я правильно понимаю? Оператор for, сперва будет работать только с первым выражением до тех пор, пока оно не станет ложным не переходя ко...

Уточнение корня методом простой итерации - C++
Ув. форумчане, помогите пожалуйста разобраться с методом простой итерации. Не пойму, в чем ошибка. То ли в условии продолжения цикла, то ли...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru