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

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

Восстановить пароль Регистрация
 
Borkot
 Аватар для Borkot
4 / 4 / 0
Регистрация: 05.05.2012
Сообщений: 182
Записей в блоге: 1
18.09.2012, 12:15     уточнение по Объеденениям #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++ Уточнение по коду
C++ Небольшое уточнение
Уточнение о геттере в классе Строка C++
C++ Уточнение о полях структуры
C++ Отделение корней уравнения и уточнение корня ур-я половинным делением
C++ Уточнение по С++11
Уточнение корня методом простой итерации C++
Уточнение корня уравнения C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Toshkarik
 Аватар для Toshkarik
1139 / 856 / 50
Регистрация: 03.08.2011
Сообщений: 2,381
Завершенные тесты: 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
Yandex
Объявления
18.09.2012, 12:49     уточнение по Объеденениям
Ответ Создать тему
Опции темы

Текущее время: 01:02. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru