0 / 0 / 0
Регистрация: 22.08.2014
Сообщений: 27
1

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

23.08.2014, 00:04. Показов 3234. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вот начал изучать cpp , до этого изучал несколько языков, таких как pawn,php и т.д.
Вопросы:
1) Что означают такие конструкции как
C
1
(тип данных)переменная
. Типо:
C
1
2
int test = 1;
cout << (DWORD)test << endl;
2) Что означают такие конструкции типо:
C
1
переменная->класс()
Ответьте новичку пожалуйста
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.08.2014, 00:04
Ответы с готовыми решениями:

Что означают эти 2 определения?
Компилируемый язык со статической типизацией. Сочетание высокоуровневых и низкоуровневых средств.

Объясните,что означают эти строки.
Списал код из учебника(о представлен ниже).Все работает,нареканий нет.После был анализ этого кода с...

Что означают эти объявления переменных?
Я не знаю как это понимать... В условии задания почему-то тип данных указан только для первой...

Помогите обьяснить что означают эти команды
Вот задача Дана целочисленная матрица размера M × N. Найти номер последней из ее строк, содержащих...

16
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
23.08.2014, 00:10 2
1) приведение к типу
2) вызов метода
1
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
23.08.2014, 00:11 3
1) С++ типизированный язык в отличии от PHP. И тут переменная $test не может хранить всё. Поэтому прочитайте про явное преобразованние данных, в данном случаи мы указываем, чтобы cout прочитал адресс test как переменную типа DWORD.
2) в php такое же есть. класс->метод()
Если работаем с объектом напрямую то Circle.draw(), если по указателю (указатель 4 байта на класс) то так : Circle->draw()
1
Заблокирован
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
1
Voivoid
23.08.2014, 10:46
  #5

Не по теме:

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

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

Не по теме:

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

0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
23.08.2014, 12:05 8
Цитата Сообщение от horr0rjkee Посмотреть сообщение
1) Что означают такие конструкции как
Код C
1
(тип данных)переменная
Декларация переменной указанного типа.

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

Добавлено через 28 секунд
Цитата Сообщение от horr0rjkee Посмотреть сообщение
Что означают такие конструкции типо:
Код C
1
переменная->класс()
Нет такой конструкции.
0
98 / 34 / 9
Регистрация: 22.08.2014
Сообщений: 104
23.08.2014, 12:14 9
1. Так переменная одного типа переделывается в переменную. другого типа.
В С++ каждая переменная относится к какому-то из нескольких типов данных, его указывают при объявлении переменной и сам собой он не изменяется. Но если у вас функция выдает (возвращает) переменную логического типа (true или false), а вам надо целое число, пишете перед вызовом функции (int)
2. Если переменная->класс(), то эта переменная не сама по себе, а член класса, а то, что вы приняли за класс() - не класс, а метод класса. Соответственно, такая конструкция означает, что этот метод класса обработает эту переменную.
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
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. Именно твой опус про асм и затмевает суть.
0
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. На остальные вообще не смотрим.

0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
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 используется как указатель на беззнаковое целое. А как именно выполняется приведение в каждом конкретном случае определяется реализациями обоих типов.
0
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
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 */
0
Форумчанин
Эксперт CЭксперт С++
8215 / 5045 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
23.08.2014, 18:11 14
-NEURON-, представьте, что вы попросили объяснить как заправить машину, а вам стали про устройство двигателя рассказывать.

Не на том уровне абстракции объясняете.
1
2273 / 1764 / 741
Регистрация: 27.07.2012
Сообщений: 5,241
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;
0
Заблокирован
24.08.2014, 05:18 16
Цитата Сообщение от taras atavin Посмотреть сообщение
Где у него хоть слово про указатели?
А где у меня?
Что за ересь? Вы хоть понимаете, что такое физический приведение типов ? Что с памятью и регистрами происходит ?
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
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- Посмотреть сообщение
А где у меня?
А нафиг так шифровать тогда?
0
24.08.2014, 10:48
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.08.2014, 10:48
Помогаю со студенческими работами здесь

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

что означают эти 0x378 или 888 в языке C++?
Привет. Объясните пожалуйста, что означают эти 0x378 или 888 в языке C++? Где можно взглянуть...

Что означают -> в c++ ?
c++ не использую, но интересует что в c++ означает конструкция -&gt; , к примеру...

Что означают !=
Помогите разобраться, что означает знак !=


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru