реклама на сайте
подробности

 
 
13 страниц V  « < 6 7 8 9 10 > »   
Reply to this topicStart new topic
> Детская ошибка
zltigo
сообщение May 11 2016, 05:53
Сообщение #106


Гуру
******

Группа: Свой
Сообщений: 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
Go to the top of the page
 
+Quote Post
dxp
сообщение May 11 2016, 06:12
Сообщение #107


Adept
******

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



QUOTE (halfdoom @ May 10 2016, 22:02) *
Они вполне сравнимы, отличается реализация, добавляется возможность расширения классов и динамическое разрешение методов, но сути это меняет.

К сожалению, я пока вижу недостаточное понимание сути языка и как следствие неверную интерпретацию его средств (попытку использовать их в привычном для другого языка стиле). Давайте вернёмся на первый вопрос: что есть класс в С++ и что есть класс в Питоне? Без ответа хотя бы на этот вопрос остальное обсуждать бессмысленно. Итак:

В С++ класс - это тип, определяемый пользователем.

В Питоне класс - это ...?


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
halfdoom
сообщение May 11 2016, 06:52
Сообщение #108


Профессионал
*****

Группа: Свой
Сообщений: 1 003
Регистрация: 20-01-05
Пользователь №: 2 072



Цитата(dxp @ May 11 2016, 09:12) *
В Питоне класс - это ...?


Это просто объект, описывающий структуру данных (включая методы и переменные класса) пригодную для создания экземпляров класса, которые тоже являются объектами.
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 11 2016, 07:01
Сообщение #109


Универсальный солдатик
******

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



К вопросу о продвижении short. Как пишет Шилдт (стр. 77), и, видимо, стандарт тоже, и подсказывает здравый смысл, в выражениях переменные типов char и short int автоматически продвигаются в int. За все процессоры не скажу, но ARM не имеет операций с байтами или парами байтов, кроме загрузить, расширить знак и сохранить.
Go to the top of the page
 
+Quote Post
aiwa
сообщение May 11 2016, 07:45
Сообщение #110


Местный
***

Группа: Участник
Сообщений: 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-ти переменных булевого типа.
Поэтому для бинарных операций разрядное равенство двух операндов строго необходимо, в отличие, теоретически, от команд арифметики.
И тут уже расширение вполне логично с заявленным типом операнда , в противном случае его можно скорректировать явным преобразованием ДО выполнения операции.

А вот унарный оператор ~ стоит особняком: его операнд самодостаточен и совершенно не требует проведения расширения.
Но в отличие от бинарных операций результат работы ~ нельзя скорректировать явным преобразованием ДО выполнения операций - только лишь после.

Go to the top of the page
 
+Quote Post
IgorKossak
сообщение May 11 2016, 07:56
Сообщение #111


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Предлагаю участникам сосредоточиться на главном вопросе и не уклоняться в сторону питона.
Модератор.
Go to the top of the page
 
+Quote Post
aiwa
сообщение May 11 2016, 08:05
Сообщение #112


Местный
***

Группа: Участник
Сообщений: 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.
Go to the top of the page
 
+Quote Post
halfdoom
сообщение May 11 2016, 08:05
Сообщение #113


Профессионал
*****

Группа: Свой
Сообщений: 1 003
Регистрация: 20-01-05
Пользователь №: 2 072



Цитата(aiwa @ May 11 2016, 10:45) *
А вот унарный оператор ~ стоит особняком: его операнд самодостаточен и совершенно не требует проведения расширения.


Почему? Ведь это оператор дополнения до единицы, который по совместительству можно использовать для побитовой инверсии.
Go to the top of the page
 
+Quote Post
scifi
сообщение May 11 2016, 08:09
Сообщение #114


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(aiwa @ May 11 2016, 11:05) *
char, short и unsigned short расширяются до знакового int.

За исключением платформ, на которых int 16-разрядный. Там unsigned short должен превратиться в unsigned int. Впрочем, там эти типы отличаются только названием rolleyes.gif
Go to the top of the page
 
+Quote Post
dxp
сообщение May 11 2016, 08:14
Сообщение #115


Adept
******

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



QUOTE (halfdoom @ May 11 2016, 12:52) *
Это просто объект, описывающий структуру данных (включая методы и переменные класса) пригодную для создания экземпляров класса, которые тоже являются объектами.

В Питоне класс - это динамическое пространство имён. Во всеми вытекающими. Т.е. это никакой не тип, как в плюсах. А все эти наследования и прочее - это средства для управления этими динамическими пространствами имён. Поэтому и семантика классов и взаимоотношения их членов с окружением совершенно иное, чем в С++. Как тут можно сравнивать вообще, я не понимаю.

P.S. Терпение модератора на исходе, поэтому больше офтопить не буду, прошу прощения за неудобства.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
aiwa
сообщение May 11 2016, 08:29
Сообщение #116


Местный
***

Группа: Участник
Сообщений: 301
Регистрация: 13-12-15
Из: Харьков
Пользователь №: 89 682



Цитата(scifi @ May 11 2016, 11:09) *
За исключением платформ, на которых int 16-разрядный. Там unsigned short должен превратиться в unsigned int. Впрочем, там эти типы отличаются только названием rolleyes.gif

Так это и не исключение. Этот случай оговорен формулировкой "к первому из списка, который в состоянии представить все допустимые значения".
Так как int не может представить значения более 32766, то следующим в списке идет unsigned int, который и будет тем "первым, который в состоянии".


Цитата(halfdoom @ May 11 2016, 11:05) *
Почему? Ведь это оператор дополнения до единицы, который по совместительству можно использовать для побитовой инверсии.

Согласен. Но ведь оператор дополнения до единицы тоже в этом смысле самодостаточен.
Хотя, да, возможные нюансы с дополнением я упустил из виду.

Странно, что везде и всюду этот оператор помечен как побитовый логический, в перекор формальному определению стандарта..

Сообщение отредактировал aiwa - May 11 2016, 08:32
Go to the top of the page
 
+Quote Post
scifi
сообщение May 11 2016, 08:54
Сообщение #117


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(aiwa @ May 11 2016, 11:29) *
Странно, что везде и всюду этот оператор помечен как побитовый логический, в перекор формальному определению стандарта..

Вы что-то путаете. Вот определение стандарта:
Цитата
The result of the ~ operator is the bitwise complement of its (promoted) operand (that is, each bit in the result is set if and only if the corresponding bit in the converted operand is not set). The integer promotions are performed on the operand, and the result has the promoted type.
Go to the top of the page
 
+Quote Post
ViKo
сообщение May 11 2016, 09:13
Сообщение #118


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 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 продвигаются, повторюсь, автоматически, независимо от одинаковости или нет типов операндов. Всегда.
Go to the top of the page
 
+Quote Post
aiwa
сообщение May 11 2016, 12:15
Сообщение #119


Местный
***

Группа: Участник
Сообщений: 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.


Go to the top of the page
 
+Quote Post
ViKo
сообщение May 12 2016, 08:28
Сообщение #120


Универсальный солдатик
******

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



Все (продвинутые) ссылаются на стандарт по языку C. Надо думать, у каждого второго он имеется. Поделитесь, пожалуйста. А то у меня одни черновики.
И на C11, если можно. И на C++14, заодно.
Go to the top of the page
 
+Quote Post

13 страниц V  « < 6 7 8 9 10 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 09:53
Рейтинг@Mail.ru


Страница сгенерированна за 0.01507 секунд с 7
ELECTRONIX ©2004-2016