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

Что означают эти конструкции? - C++

Восстановить пароль Регистрация
 
horr0rjkee
0 / 0 / 0
Регистрация: 22.08.2014
Сообщений: 15
23.08.2014, 00:04     Что означают эти конструкции? #1
Вот начал изучать cpp , до этого изучал несколько языков, таких как pawn,php и т.д.
Вопросы:
1) Что означают такие конструкции как
C
1
(тип данных)переменная
. Типо:
C
1
2
int test = 1;
cout << (DWORD)test << endl;
2) Что означают такие конструкции типо:
C
1
переменная->класс()
Ответьте новичку пожалуйста
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
23.08.2014, 00:10     Что означают эти конструкции? #2
1) приведение к типу
2) вызов метода
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2135 / 968 / 223
Регистрация: 30.11.2013
Сообщений: 3,239
23.08.2014, 00:11     Что означают эти конструкции? #3
1) С++ типизированный язык в отличии от PHP. И тут переменная $test не может хранить всё. Поэтому прочитайте про явное преобразованние данных, в данном случаи мы указываем, чтобы cout прочитал адресс test как переменную типа DWORD.
2) в php такое же есть. класс->метод()
Если работаем с объектом напрямую то Circle.draw(), если по указателю (указатель 4 байта на класс) то так : Circle->draw()
-NEURON-
Заблокирован
23.08.2014, 07:22     Что означают эти конструкции? #4
Цитата Сообщение от horr0rjkee Посмотреть сообщение
1
(тип данных)переменная
Вся беда высоко и очень выокоуровневых языков в том, что они не дают понять, как устроенны ЭВМ и отупляют народ. Assembler & C++ forever
По делу, вот представь ситуацию в таком ракурсе, вот какой - то блок памяти твоего процесса:
0x34 0x11 0x55 0x66
вот смотри, это последовательность 4-х байтов, начиная с 0х34.
Переменная DWORD из WinApi - это DOUBLE WORD, то есть двойное слово - 4 байта размером (простое слово - два байта).
Теперь смотри ещё раз на свои байты 0x34 0x11 0x55 0x66. Если например ты приведёшь эту переменную к двух байтовой, то есть к обычному слову WORD, то эта переменная возьмёт первые два байты и из них формирует своё число, то есть будет просто WORD 0x34 0x11, приведёшь к BYTE (unsigned char) - будет один байт, то есть 0x34, понимаешь?

Но на самом деле это ерунда, т.к. это в основном вызывает интерес, когда передаёшь в какую - то функцию простой указатель ни на что, то есть на пустоту так сказать - void* , то есть для внутренних операндов функции это всего лишь указатель на блок памяти с какого - то стартового адреса не известной длинны, а вот если ты знаешь, что там должно быть, ты приводишь этот указатель к чему угодно, например к тип класса
Ладно, сложно это объяснит тому, кто не зная основ ЭВМ прыгнул на PHP
Voivoid
23.08.2014, 10:46
  #5

Не по теме:

Цитата Сообщение от -NEURON- Посмотреть сообщение
0x34 0x11 0x55 0x66
Лол, C'шники в своем репертуаре, человек про приведение типов спрашивает, а в ответ ему говорят про байтики и void*. И с такой-то гордостью, ух. Классика жанра

Справлюсь
 Аватар для Справлюсь
23 / 23 / 5
Регистрация: 24.07.2014
Сообщений: 203
23.08.2014, 11:12     Что означают эти конструкции? #6
Цитата Сообщение от -NEURON- Посмотреть сообщение
Вся беда высоко и очень выокоуровневых языков в том, что они не дают понять, как устроенны ЭВМ и отупляют народ.
согласен!!!
правда дальше не понял, Ассемблер вроде же низкоуровневый яз.
John Prick
23.08.2014, 11:56
  #7

Не по теме:

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Поэтому прочитайте про явное преобразованние данных, в данном случаи мы указываем, чтобы cout прочитал адресс test как переменную типа DWORD.
Чего??.. Там просто приведение к DWORD. Никаких адресов и в помине нет.

taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
23.08.2014, 12:05     Что означают эти конструкции? #8
Цитата Сообщение от horr0rjkee Посмотреть сообщение
1) Что означают такие конструкции как
Код C
1
(тип данных)переменная
Декларация переменной указанного типа.

Добавлено через 51 секунду
Цитата Сообщение от horr0rjkee Посмотреть сообщение
int test = 1;
Декларация переменной типа int, которую зовут test, а инициируется она она значением 1.

Добавлено через 28 секунд
Цитата Сообщение от horr0rjkee Посмотреть сообщение
Что означают такие конструкции типо:
Код C
1
переменная->класс()
Нет такой конструкции.
Казерская Ирина
95 / 31 / 6
Регистрация: 22.08.2014
Сообщений: 102
23.08.2014, 12:14     Что означают эти конструкции? #9
1. Так переменная одного типа переделывается в переменную. другого типа.
В С++ каждая переменная относится к какому-то из нескольких типов данных, его указывают при объявлении переменной и сам собой он не изменяется. Но если у вас функция выдает (возвращает) переменную логического типа (true или false), а вам надо целое число, пишете перед вызовом функции (int)
2. Если переменная->класс(), то эта переменная не сама по себе, а член класса, а то, что вы приняли за класс() - не класс, а метод класса. Соответственно, такая конструкция означает, что этот метод класса обработает эту переменную.
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
23.08.2014, 12:15     Что означают эти конструкции? #10
Цитата Сообщение от -NEURON- Посмотреть сообщение
Вся беда высоко и очень выокоуровневых языков в том, что они не дают понять, как устроенны ЭВМ и отупляют народ. Assembler & C++ forever
По делу, вот представь ситуацию в таком ракурсе, вот какой - то блок памяти твоего процесса:
0x34 0x11 0x55 0x66
вот смотри, это последовательность 4-х байтов, начиная с 0х34.
Переменная DWORD из WinApi - это DOUBLE WORD, то есть двойное слово - 4 байта размером (простое слово - два байта).
Теперь смотри ещё раз на свои байты 0x34 0x11 0x55 0x66. Если например ты приведёшь эту переменную к двух байтовой, то есть к обычному слову WORD, то эта переменная возьмёт первые два байты и из них формирует своё число, то есть будет просто WORD 0x34 0x11, приведёшь к BYTE (unsigned char) - будет один байт, то есть 0x34, понимаешь?
Но на самом деле это ерунда, т.к. это в основном вызывает интерес, когда передаёшь в какую - то функцию простой указатель ни на что, то есть на пустоту так сказать - void* , то есть для внутренних операндов функции это всего лишь указатель на блок памяти с какого - то стартового адреса не известной длинны, а вот если ты знаешь, что там должно быть, ты приводишь этот указатель к чему угодно, например к тип класса
1. Где у него хоть слово про указатели?
2. В общем случае может присвоиться любое слово, не только стартовое, но и завершающее, из середины, или вообще составленное из не соседних байтов. И байт может присвоиться любой.
3. Именно твой опус про асм и затмевает суть.
rikimaru2013
23.08.2014, 15:18
  #11

Не по теме:

Цитата Сообщение от John Prick Посмотреть сообщение
Чего??.. Там просто приведение к DWORD. Никаких адресов и в помине нет.
Мне казалось, что преобразованние это то как будут интерпретироваться определённое количество бит, тоесть:
C++
1
char x = (char)test
Идёт по адрессу test, берём значение переменной int test 0100 00011 0101 0101 и так как просят явнопреобразовывать в char, записываем в x только 8 младших битов 0101 0101. На остальные вообще не смотрим.

taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
23.08.2014, 15:38     Что означают эти конструкции? #12
Цитата Сообщение от John Prick Посмотреть сообщение
Чего??.. Там просто приведение к DWORD. Никаких адресов и в помине нет.
Ну ни нафиг было так шифровать? Даже я, зная и асм, и плюсы, не понял, чего ты хотел сказать.

Добавлено через 9 минут
horr0rjkee, значения, параметры, операнды и переменные бывают разных типов, но иногда надо использовать значение/переменную одного типа для присваивания его переменной другого типа, передать значение/переменную одного типа в функцию в качестве параметра другого типа, или использовать значение/переменную одного типа в качестве операнда другого типа. В этом случае надо привести значение/переменную к требуемому типу. Для этого и используются операторы приведения, такой оператор выглядит, как заключённый в скобки целевой тип. То есть
C++
1
(int) z
значит привести z к типу int,
C++
1
(char *)t
- привести t к типу char*, то есть к указателю на char. Дебри про слова и байты сюда здесь ни к чему, приведение может происходить без фактического преобразования, например,
C++
1
2
3
int *p;
unsigned int *d;
d=(unsigned int*)p;
при приведении не происходит ни усекновение разрядности, ни дополнение её, ни изменение каких либо байтов, ни изменение их порядка. Но указатель p используется как указатель на беззнаковое целое. А как именно выполняется приведение в каждом конкретном случае определяется реализациями обоих типов.
Alex5
883 / 618 / 81
Регистрация: 12.04.2010
Сообщений: 1,552
23.08.2014, 18:09     Что означают эти конструкции? #13
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
C++
1
char x = (char)test
записываем в x только 8 младших битов 0101 0101
rikimaru2013, именно так и будет. Причём то же самое будет, если
C++
1
2
int n = 1;
char x = test; // т.к. sizeof(char)==1, значит 4 байта никак не запишем
Добавлено через 5 минут
Пример приведения типов.
C++
1
2
3
char c = 'N';
std::cout << c << endl; /* будет напечатано    N */ 
std:: cout << (int)c << endl;  /* будет напечатано    78 */
Добавлено через 2 минуты
C++
1
2
3
int n = -1;
std::cout << n << endl; /* -1 */ 
std:: cout << (unsigned int)n << endl;  /*   4294967295 */
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4923 / 2666 / 243
Регистрация: 29.11.2010
Сообщений: 7,421
23.08.2014, 18:11     Что означают эти конструкции? #14
-NEURON-, представьте, что вы попросили объяснить как заправить машину, а вам стали про устройство двигателя рассказывать.

Не на том уровне абстракции объясняете.
John Prick
754 / 687 / 123
Регистрация: 27.07.2012
Сообщений: 1,974
Завершенные тесты: 3
23.08.2014, 23:13     Что означают эти конструкции? #15
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Мне казалось, что преобразованние это то как будут интерпретироваться определённое количество бит, тоесть:
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Идёт по адрессу test, берём значение переменной int test 0100 00011 0101 0101 и так как просят явнопреобразовывать в char, записываем в x только 8 младших битов 0101 0101. На остальные вообще не смотрим.
А как тогда будет работать, например такое:
C++
1
2
double pi = 3.142;
int nearly_pi = (int)pi;
-NEURON-
Заблокирован
24.08.2014, 05:18     Что означают эти конструкции? #16
Цитата Сообщение от taras atavin Посмотреть сообщение
Где у него хоть слово про указатели?
А где у меня?
Что за ересь? Вы хоть понимаете, что такое физический приведение типов ? Что с памятью и регистрами происходит ?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.08.2014, 10:48     Что означают эти конструкции?
Еще ссылки по теме:

C++ Что означают эти значения красным цветом?
C++ Что означают -> в c++ ?

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

Или воспользуйтесь поиском по форуму:
taras atavin
Ушёл с форума.
 Аватар для taras atavin
3569 / 1752 / 91
Регистрация: 24.11.2009
Сообщений: 27,619
24.08.2014, 10:48     Что означают эти конструкции? #17
Цитата Сообщение от -NEURON- Посмотреть сообщение
Вы хоть понимаете, что такое физический приведение типов ? Что с памятью и регистрами происходит ?
Регистры здесь абсолютно ни при чём, приведение типа - эта смена интерпретации данного, опционально сопровождающиеся изменением самого значения и/или разрядности. При привидении unsigend long int к unsigend short int выделяется младшее слово. Но какое из них младшее? 0x0F 0x34 0xDE 0x4C - это 0x0F34DE4C, или 0x4DE4C0F34? А может 0x340F4C0xDE? Это зависит от процессора, причём, не от регистров, а от того, отображается ли младшая часть регистра на младший, или на старший адрес. А unsigend long int* к unsigend short int* приводится без фактического преобразования, то есть ограничиваясь только сменой интерпретации данного как указатель на ячейку другого типа. Но при этом ни сам адрес, ни его запись адреса на низком уровне не меняются вовсе. Так что как раз низкоуровневые языки не всякое приведение типов даже поддерживают, а вот на высоком уровне, где приведение типов меняет саму информацию, а с кодом связано лишь в плане реализации, вот там как раз для приведений полный простор и любое приведение можно разобрать и даже можно написать реализацию оператора приведения.

Добавлено через 5 минут
Цитата Сообщение от -NEURON- Посмотреть сообщение
А где у меня?
А нафиг так шифровать тогда?
Yandex
Объявления
24.08.2014, 10:48     Что означают эти конструкции?
Ответ Создать тему
Опции темы

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