|
|
  |
Детская ошибка |
|
|
|
May 11 2016, 05:53
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
QUOTE (GetSmart @ May 11 2016, 07:40)  По поводу вумного ИАРа, выкинувшего ветвь исходника, топикстартер правильно поднял тему. Отсутствие предупреждения "unreachable code" тянет на недоработку компилятора. Для того, что бы "программисту" включить мозг достаточно выдаваемого IAR-ом сообщения: [Pa091]: operator operates on value promoted to int (with possibly unexpected result) Пусть думает, как однозначно донести свои думы до компилятора. Более того, это сообщение много информативнее, чем желаемое "unreachable code", ибо указывает на ПРИЧИНУ непонимания, а на следствие.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
May 11 2016, 06:12
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
QUOTE (halfdoom @ May 10 2016, 22:02)  Они вполне сравнимы, отличается реализация, добавляется возможность расширения классов и динамическое разрешение методов, но сути это меняет. К сожалению, я пока вижу недостаточное понимание сути языка и как следствие неверную интерпретацию его средств (попытку использовать их в привычном для другого языка стиле). Давайте вернёмся на первый вопрос: что есть класс в С++ и что есть класс в Питоне? Без ответа хотя бы на этот вопрос остальное обсуждать бессмысленно. Итак: В С++ класс - это тип, определяемый пользователем. В Питоне класс - это ...?
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
May 11 2016, 07:45
|
Местный
  
Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682

|
Цитата(GetSmart @ May 11 2016, 07:40)  Код char a; short b; long c;
c = ~a & b & c; Идеально всё-равно не получится. Чуть менее криво или чуть более в таких выражениях. В комбинации с другими операторами будет новая кривизна. Захочется ведь ещё беззнаково расширять. Идеально, в смысле который Вы имеете ввиду, и не должно получиться. В силу того, что побитовые логические операции не имеют никакого отношения к знаковости переменной и они не имеют совершенно никакого отношения к арифметике. Любую побитовую логическую операцию можно рассматривать как набор побитовых операций булевой алгебры между соответствующими разрядами двух операндов. Грубо говоря двухбйтная переменная в этом случае это не short или unsigned short, а упорядоченный набор 16-ти переменных булевого типа. Поэтому для бинарных операций разрядное равенство двух операндов строго необходимо, в отличие, теоретически, от команд арифметики. И тут уже расширение вполне логично с заявленным типом операнда , в противном случае его можно скорректировать явным преобразованием ДО выполнения операции. А вот унарный оператор ~ стоит особняком: его операнд самодостаточен и совершенно не требует проведения расширения. Но в отличие от бинарных операций результат работы ~ нельзя скорректировать явным преобразованием ДО выполнения операций - только лишь после.
|
|
|
|
|
May 11 2016, 08:05
|
Местный
  
Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682

|
Цитата(ViKo @ May 11 2016, 10:01)  К вопросу о продвижении short. Как пишет Шилдт (стр. 77), и, видимо, стандарт тоже, и подсказывает здравый смысл, в выражениях переменные типов char и short int автоматически продвигаются в int. За все процессоры не скажу, но ARM не имеет операций с байтами или парами байтов, кроме загрузить, расширить знак и сохранить. Если обобщить пункты в стандарте, то приводится к первому из списка (int, unsigned int, long int, unsigned long int, long long int, or unsigned long long int) типу, который в состоянии представить все допустимые значения расширяемого (продвигаемого) типа. char, short и unsigned short расширяются до знакового int.
|
|
|
|
|
May 11 2016, 08:14
|

Adept
     
Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343

|
QUOTE (halfdoom @ May 11 2016, 12:52)  Это просто объект, описывающий структуру данных (включая методы и переменные класса) пригодную для создания экземпляров класса, которые тоже являются объектами. В Питоне класс - это динамическое пространство имён. Во всеми вытекающими. Т.е. это никакой не тип, как в плюсах. А все эти наследования и прочее - это средства для управления этими динамическими пространствами имён. Поэтому и семантика классов и взаимоотношения их членов с окружением совершенно иное, чем в С++. Как тут можно сравнивать вообще, я не понимаю. P.S. Терпение модератора на исходе, поэтому больше офтопить не буду, прошу прощения за неудобства.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
May 11 2016, 08:29
|
Местный
  
Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682

|
Цитата(scifi @ May 11 2016, 11:09)  За исключением платформ, на которых int 16-разрядный. Там unsigned short должен превратиться в unsigned int. Впрочем, там эти типы отличаются только названием  Так это и не исключение. Этот случай оговорен формулировкой "к первому из списка, который в состоянии представить все допустимые значения". Так как int не может представить значения более 32766, то следующим в списке идет unsigned int, который и будет тем "первым, который в состоянии". Цитата(halfdoom @ May 11 2016, 11:05)  Почему? Ведь это оператор дополнения до единицы, который по совместительству можно использовать для побитовой инверсии. Согласен. Но ведь оператор дополнения до единицы тоже в этом смысле самодостаточен. Хотя, да, возможные нюансы с дополнением я упустил из виду. Странно, что везде и всюду этот оператор помечен как побитовый логический, в перекор формальному определению стандарта..
Сообщение отредактировал aiwa - May 11 2016, 08:32
|
|
|
|
|
May 11 2016, 09:13
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362

|
Цитата(aiwa @ May 11 2016, 11:05)  Если обобщить пункты в стандарте, то приводится к первому из списка (int, unsigned int, long int, unsigned long int, long long int, or unsigned long long int) типу, который в состоянии представить все допустимые значения расширяемого (продвигаемого) типа. char, short и unsigned short расширяются до знакового int. Если в выражении используются разные типы, тогда действует описанное вами продвижение. Типы же char, short продвигаются, повторюсь, автоматически, независимо от одинаковости или нет типов операндов. Всегда.
|
|
|
|
|
May 11 2016, 12:15
|
Местный
  
Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682

|
Цитата(scifi @ May 11 2016, 11:54)  Вы что-то путаете. Вот определение стандарта: Цитата N4582 Date: 2016-03-19 5. Expressions 5.3.1 Unary operators 5.3.1 8). The operand of the unary - operator shall have arithmetic or unscoped enumeration type and the result is the negation of its operand. Integral promotion is performed on integral or enumeration operands. The negative of an unsigned quantity is computed by subtracting its value from 2n, where n is the number of bits in the promoted operand. The type of the result is the type of the promoted operand.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|