LINUX.ORG.RU

Ответ на: комментарий от ziemin

Я понял, чего ты не понимаешь!

Я не понимаю почему указатель нельзя назвать типом данных.

backburner ()
Ответ на: комментарий от backburner

Я не понимаю почему указатель нельзя назвать типом данных.

С точки зрения ассемблера ты прав. 32 бит это либо указатель либо просто число.

С точки зрения C это почти так. Но можно только кастовать.

С точки зрения плюсов это моветон: руки тебе за это не отрубят, но ознакомившиеся с твоим кодом, этого очень будут желать.

Рекомендую начать с самого начала, что бы ты хоть немного понимал, о чём идёт речь.

ziemin ★★ ()
Ответ на: комментарий от ziemin

Определение с википедии (ISO/IEC/IEEE 24765-2010):

Тип данных — класс данных, характеризуемый членами класса и операциями, которые могут быть к ним применены

Чем char* не тип данных? Содержит адрес, операции определены: может быть скастован к void*, может быть получено значение типа char*, может быть скастован к int'у, арифметические операторы.

руки тебе за это не отрубят, но ознакомившиеся с твоим кодом, этого очень будут желать

Я вроде нигде не предлагал кастовать указатели к int'у.

backburner ()

Следующий вопрос должен быть за указатель на указатель, там достойный простор для верстки. А там и тройной указатель не за горами.

hizel ★★★★★ ()
Ответ на: комментарий от backburner

В ассемблере да. А в C/C++ нет такого типа. Я ожидал чего-нибудь вроде void*, а ты так глупо следуешь стереотипам. Вот насчёт void* у меня только одна отмазка - это решает компилятор.

А насчёт char* - такого типа нет, а указатели такого типа вычисляются по адресной арифметике.

ziemin ★★ ()
Ответ на: комментарий от ziemin

Это в ассемблере нет такого типа, там отличие целого от указателя только в голове у программиста. А в C — есть.

такого типа нет

То есть может быть переменная без типа? Язык вроде бы статически типизирован, у каждой переменной должен быть тип.

backburner ()
Ответ на: комментарий от backburner

То есть может быть переменная без типа? Язык вроде бы статически типизирован, у каждой переменной должен быть тип.

Статически чего? Мы об одном и томже языке говорим?

(void*)(char)(int)1(1)

ziemin ★★ ()
Ответ на: комментарий от ziemin

(void*)(char)(int)1(1)

Это даже не скомпилируется. Что это выражение должно символизировать, что C позволяет преобразовывать между целыми и указателями? Я знаю это.

backburner ()
Ответ на: комментарий от backburner

А так можно? g++ говорит,

error: expected unqualified-id before ‘[’ token
 int[] a, b, c;
    ^

al_exquemelin ★★★ ()
Ответ на: комментарий от al_exquemelin

Ну конечно, это java как пример языка с меньшим количеством странных нелогичностей.

backburner ()
Ответ на: комментарий от ioexception

а еще мне говорят что я плохо знаю плюсы...

а ты их типа хорошо знаешь?

WRG ★★★★ ()

Столько флуда и еще никто не сказал, что на С++ надо писать никак.

buddhist ★★★★★ ()
Ответ на: комментарий от backburner

Объявление переменной состоит из двух частей: тип и имя

Для C и C++ синтаксически это не так. Там свои правила объявления.

anonymous ()
Ответ на: комментарий от ziemin

Типа int* не существует.

Стандарты и Си и крестов с тобой не согласны. Ты говоришь ерунду. Указатели являются типами. Хорошо бы, если бы ссылки в крестах типами не являлись, но даже они типы.

anonymous ()
Ответ на: комментарий от WRG

А что ты сейчас делаешь на C++? Скажи, тогда я предложу тебе альтернативу(если она есть)

anonymous ()
Ответ на: комментарий от ioexception

Я научился писать и троллить на лоре

Ваша фантазия сыграла с вами злую шутку. Выставить себя идиотом и радоваться этому - это не троллинг.

andreyu ★★★★★ ()
Ответ на: комментарий от i-rinat
for (auto u : users)                     {
  if (u == ioexception)                  {
    std::cout << "ЯЗАБАН" << std::endl;  }
  else                                   {
    make_tupnyak();                      }}
Kuzy ★★★ ()
Ответ на: комментарий от backburner

Это даже не скомпилируется

Лошара. В реальности это откомпилирует компилятор (внезапно!!!!!1)

ziemin ★★ ()
Ответ на: комментарий от ioexception

здесь же я получаю выжимки опыта проверенного временем

Это прям как у Сорокина - «соки говн».
Каждому своё, чо.

thesis ★★★★★ ()
Ответ на: комментарий от ziemin

Будет здорово, если ты через какое-то время сам скажешь правильный ответ. Заранее спасибо.

kaffeine ()
Ответ на: комментарий от ziemin

указатели, ссылки, массивы, классы и структуры - все это в с++ считается типами данных.по крайней мере, так пишет страуструп. и так написано в стандарте. а как их там компилятор реализует дело десятое. типами данных они от этого быть не перестают.

tyro33 ()
Ответ на: комментарий от ziemin

3.9.2/3

Thetype of a pointer to void or a pointer to an object type is called an object pointer type. [Note: A pointer to void does not have a pointer-to-object type, however, because void is not an object type. —end note] The type of a pointer that can designate a function is called a function pointer type. A pointer to objects of type T is referred to as a “pointer to T.” [Example: a pointer to an object of type int is referred to as “pointer to int ” and a pointer to an object of class X is called a “pointer to X.” —end example] Except for pointers to static members, text referring to “pointers” does not apply to pointers to members. Pointers to incomplete types are allowed although there are restrictions on what can be done with them (3.11). A valid value of an object pointer type represents either the address of a byte in memory (1.7) or a null pointer (4.10). If an object of type T is located at an address A, a pointer of type cv T* whose value is the address A is said to point to that object, regardless of how the value was obtained. [Note: For instance, the address one past the end of an array (5.7) would be considered to point to an unrelated object of the array’s element type that might be located at that address. There are further restrictions on pointers to objects with dynamic storage duration; see 3.7.4.3. —end note] The value representation of pointer types is implementation-defined. Pointers to cv-qualified and cv-unqualified versions (3.9.3) of layout-compatible types shall have the same value representation and alignment requirements (3.11). [Note: Pointers to over-aligned types (3.11) have no special representation, but their range of valid values is restricted by the extended alignment requirement. This International Standard specifies only two ways of obtaining such a pointer: taking the address of a valid object with an over-aligned type, and using one of the runtime pointer alignment functions. An implementation may provide other means of obtaining a valid pointer value for an over-aligned type.—end note]

anonymous ()

Меня не было три дня, а пациента ещё не забанили. Как же так???

Капча: анон_всегда_прав

anonymous ()
Ответ на: комментарий от ziemin

Мне, например, не понятно какого хрена ты, нихрена не зная, вещаешь с умным видом. Ведь тебе кто-то может поверить и повторять подобную чушь ещё где-то. Откуда ты хоть свои «сведения» берёшь? Какой источник? Какие аргументы у тебя есть?

anonymous ()
Ответ на: комментарий от anonymous

Мне, например, не понятно какого хрена ты, нихрена не зная, вещаешь с умным видом. Ведь тебе кто-то может поверить и повторять подобную чушь ещё где-то. Откуда ты хоть свои «сведения» берёшь? Какой источник? Какие аргументы у тебя есть?

Прям глаза разбегаются. На что отвечать-то? Ты же не троль?

ziemin ★★ ()
Ответ на: комментарий от backburner

арифметические операторы.

только вычитание и сложение с size_t(точнее с ptrdiff_t полученной вычитанием. В рамках). И то, при этом всё в рамках массива.

Иначе UB.

Т.е. это тип, но с особыми свойствами, почти всё запрещено, но компилятор молчит, что-бы ты не делал. Потому новички говнокодят забыв про UB.

emulek ()
Ответ на: комментарий от backburner

То есть может быть переменная без типа? Язык вроде бы статически типизирован, у каждой переменной должен быть тип.

раз есть переменная, есть и тип. В динамике тип постоянно меняется.

emulek ()
Ответ на: комментарий от ziemin

Мы об одном и томже языке говорим?

я не знаю про что ты, в стандарте C такого говна нет. А то, что компилятор жрёт, так он любое говно жрёт. Никто не обещал, что компилятор все ошибки будет замечать.

emulek ()
Ответ на: комментарий от backburner

что C позволяет преобразовывать между целыми и указателями?

НЕ ПОЗВОЛЯЕТ

просто отследить сложно компилятору эту ОШИБКУ.

emulek ()
Ответ на: комментарий от backburner

Он даст неожиданный и нелогичный результат

Он даст совершенно ожидаемый и логичный результат, но при условии что ты читал главу 8.3 стандарта «Meaning of declarators».

fang ()
Ответ на: комментарий от fang

Он даст совершенно ожидаемый и логичный результат

TYPE X;// X объявляется как TYPE
TYPE Y, Z;// Z объявляется НЕ как TYPE. Почему?

ты читал главу 8.3

не ты один читал. Сишка старше меня, там полно костылей и костыликов. K&R же в своей книге писали: хотелось как лучше, получилось как всегда. Ну типа «логично», что-бы

int *x;// объявление
*x = 3;// инициализация
*x += 17;// использование
но налепили поверх тонну дерьма, те же const.

emulek ()
Ответ на: комментарий от emulek

Я знаю что это UB, хотя некоторые библиотеки (GTK например) полагаются на конкретное поведение компилятора: https://developer.gnome.org/glib/stable/glib-Type-Conversion-Macros.html

Но суть не в этом, а в том что я так и не понял, что же ziemen пытается до меня донести и какое отношение это имеет к исходной теме разговора.

backburner ()
Ответ на: комментарий от fang

ты читал главу 8.3 стандарта «Meaning of declarators»

В таком случае результат будет ожидаемым, но логичнее он от этого не станет.

backburner ()
Ответ на: комментарий от backburner

что же ziemen пытается до меня донести

как я понимаю, что

1. int* это тип

2. указатель — _особый_ тип.

emulek ()
Ответ на: комментарий от emulek

int* это тип

Нет:

Нет такого типа int*.

Это было ответом на мой пост о том, что char* a, b, c воспринимается как объявление трех указателей, что неверно.

backburner ()
Ответ на: комментарий от emulek
TYPE X;// X объявляется как TYPE
TYPE Y, Z;// Z объявляется НЕ как TYPE. Почему?

Потому что тип объявленной переменной и имя типа это не одно и то же.

Потому что синтаксически объявление имеет структуру

declaration --> [storage-class-specifier] [type-qualifier] type-specifier init-declarator-list

type-specifier -->

  • integral-type-name
  • struct-specifier
  • typedef-name
  • ...

init-declarator-list -->

  • declarator-initializer
  • declarator-initializer,init-declarator-list

declarator-initializer -->

  • declarator
  • declarator = expression

declarator -->

  • direct-declarator
  • pointer direct-declarator
  • ...

И если ты написал, неважно будь то

int *a, b
или
int* a, b

то ты и получишь переменные разных типов, потому что у них разные деклараторы.

int *x;// объявление
*x = 3;// инициализация
*x += 17;// использование

Ты ж нерабочие программы пишешь

fang ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.