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

 
 
18 страниц V  « < 6 7 8 9 10 > »   
Reply to this topicStart new topic
> Косяк у Кейла, Препроцессор не следит за скобками
zltigo
сообщение Aug 30 2015, 11:07
Сообщение #106


Гуру
******

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



QUOTE (Golikov A. @ Aug 30 2015, 14:01) *
По вашему же примеру
if (fooType == FOO_TYPE_A || FOO_TYPE_B)
что хотел этой строкой сказать автор?

Не сочтите за труд прочитать пост автора полностью. Там черным по белому написано что хотел, но ошибся результате чего действительно получилась ГЛУПОСТЬ, но GCC компилятор ее пропустил в отличие от другого, котрому можно (и нужно) сказать, что if(1) и ему подобные, считать, если не ошибочными, то уж подозрительными ввиду бессмысленности анализа.
QUOTE
Написана глупость и плохо написана, но обсуждаем что компилятор пропустил ошибку. А может он за вас и программу должен написать? Советы давать где вы что не так закодили?

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

В данном случае вместо if (fooType == FOO_TYPE_A || FOO_TYPE_B) компилятор будет де-факто компилировать if(1) вопрос только в том, надо знать об этом программисту, или хрен с ним и пусть "знающий азы" разбирается уже с результатом, поскольку "просто ошибки не плодить" надо было. Типа сам дурак.

Мой ответ Вы знаете. А каков Ваш, если еще раз подумать?


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ViKo
сообщение Aug 30 2015, 12:25
Сообщение #107


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

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



Цитата(zltigo @ Aug 30 2015, 14:07) *
В данном случае вместо if (fooType == FOO_TYPE_A || FOO_TYPE_B) компилятор будет де-факто компилировать if(1)

С чего это?
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 30 2015, 15:07
Сообщение #108


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(zltigo @ Aug 30 2015, 14:17) *
Это Вы себя пытаетесь убедить повторяя одно и то-же? Тогда можете продолжать.

Вам было указано на преднамеренное притягивание за уши цикла for к бесконечным. Вашим всевышним. Этот цикл конструктивно более сложносоставной и естественное его применение в проходе какой-то последовательности итераций. Для этого есть раздел инициализации. Безотносительно к стандарту Си, аналог цикла while наиболее естественнен для бесконечного цикла. То, что разработчики стандарта "заставили" компиляторы по-другому толковать управляющее условие for - на их совести. Подсказка константности условия выполнения цикла ещё более актуальна для for. Критика while попахивает лозунгом "как завещал великий Ленин".


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Mihey_K
сообщение Aug 30 2015, 16:21
Сообщение #109


Частый гость
**

Группа: Участник
Сообщений: 156
Регистрация: 27-09-06
Из: Irkutsk
Пользователь №: 20 747



В защиту GCC - по умолчанию он молчалив, но Wall/Wextra никто не отменял.
В защиту K&R - если кому-то что-то не нравится, то это ваше дело, но правила есть правила, и библия K&R в первую очередь явилась фундаментом для стандарта ANSI C (C89). С тех пор многое поменялось в лице сахара, новых типов, макросов и т.д., но никак не фундаментальные вещи. Например, найдите отличия между главой 3.5 Циклы for и while и 6.8.5.3 The for statement C11 или между А 6.5. Арифметические преобразования и 6.3.1 Arithmetic operands С11. Пример про преобразование типов, что я приводил ранее, все же из ранних трудов и сейчас неактуален, т.к. в новом издании K&R ANSI преобразование звучит иначе (см. ссылку выше)
По поводу горячего спора for(;;){} vs while(1){} все точки над и уже расставлены, но for(;;) лег в основу FreeRTOS и ядра Linux.

Сообщение отредактировал Mihey_K - Aug 30 2015, 17:02


--------------------
Блог о разработке на CC430, SIM900, GPS, ARM и не только...
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 30 2015, 16:53
Сообщение #110


Гуру
******

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



QUOTE (ViKo @ Aug 30 2015, 15:25) *
С чего это?

А это пусть будет Вам "домашним заданием" sm.gif



--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 30 2015, 17:03
Сообщение #111


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(zltigo @ Aug 30 2015, 14:17) *
Это Вы себя пытаетесь убедить повторяя одно и то-же?

Например код while (c = *ptr++) ... выдаёт варнинг в Кейле и ремарку в ИАРе. А это самый оптимизированный вариант вывода строки. Так что ругательство может указывать и на "высококачественные" участки кода. Типа "чувак, не гони так быстро" sm.gif

В чём критерий качества?


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 30 2015, 17:46
Сообщение #112


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(GetSmart @ Aug 30 2015, 20:03) *
Например код while (c = *ptr++) ... выдаёт варнинг в Кейле и ремарку в ИАРе.
А while ((c = *ptr++)) не будет.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
ViKo
сообщение Aug 30 2015, 18:17
Сообщение #113


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

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



Цитата(zltigo @ Aug 30 2015, 19:53) *
А это пусть будет Вам "домашним заданием" sm.gif

if (fooType == FOO_TYPE_A || FOO_TYPE_B)
Пусть fooType не равно FOO_TYPE_A, а FOO_TYPE_B равно 0. И...?

К примеру, константы определены в виде перечисления:
typedef enum {
FOO_TYPE_B,
FOO_TYPE_A,
FOO_TYPE_ZLTIGO,
...
} FooType_t;
и в данный момент fooType == FOO_TYPE_ZLTIGO rolleyes.gif
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 31 2015, 09:08
Сообщение #114


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(Сергей Борщ @ Aug 30 2015, 21:46) *
А while ((c = *ptr++)) не будет.

Напоминает фичу разработчиков компилятора. Разве по стандарту это не одно и то же?


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Aug 31 2015, 09:20
Сообщение #115


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(GetSmart @ Aug 31 2015, 12:08) *
Напоминает фичу разработчиков компилятора.
Возможно. Как и сами предупреждения с примечаниями. Это работает, грех не использовать.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 31 2015, 10:15
Сообщение #116


Гуру
******

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



QUOTE (Сергей Борщ @ Aug 31 2015, 12:20) *
Возможно. Как и сами предупреждения с примечаниями.

Нет. Это абсолютно чистый, как слеза, Си обязательный к однозначному толкованию любым компилятором. Использовано правило по которому выражение с оператором присваивания заключенное в круглые скобки равно присваемому. Просто надо знать и понимать язык, тогда и мысли свои донести до компилятора можно четко не подавляя предупреждения, и не удивлясь тому, что они есть на разлюбезный, но неграмотный while(1).
Замечу, если кто не понимает, что наружные скобки это принадлежность оператора, а вот внутренние это они самые.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Aug 31 2015, 10:49
Сообщение #117


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Цитата(Mihey_K @ Aug 30 2015, 20:21) *
По поводу горячего спора for(;;){} vs while(1){} все точки над и уже расставлены

Цитата
If even a C beginner knows that for(;;) means an eternal loop, then who are you trying to make the code more readable for?

I guess that's what it all really boils down to. If you find yourself trying to make your source code readable for non-programmers, who don't even know the fundamental parts of the programming language, then you are only wasting time. They should not be reading your code.

And since everyone who should be reading your code already knows what for(;;) means, there is no point in making it further readable - it is already as readable as it gets.

Аргументация апостола.

Цитата
There is one big, practical problem with this form, namely that compilers tend to give a warning for it: "condition is always true" or similar. That is a good warning, of a kind which you really don't want to disable, because it is useful for finding various bugs. For example a bug such as while(i = 1), when the programmer intended to write while(i == 1).

Только самый глупый компилятор не смог бы отличить было ли в выражении присваивание самой последней операцией.
+1 гвоздь.

Цитата(zltigo @ Aug 31 2015, 14:15) *
Нет. Это абсолютно чистый, как слеза, Си обязательный к однозначному толкованию любым компилятором. Использовано правило по которому выражение с оператором присваивания заключенное в круглые скобки равно присваемому. Просто надо знать и понимать язык.
Замечу, если кто не понимает, что наружные скобки это принадлежность оператора, а вот внутренние это они самые.

То есть rvalue? А почему адрес (&) можно брать через скобки или кучу скобок?

Сообщение отредактировал GetSmart - Aug 31 2015, 13:19


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 31 2015, 10:55
Сообщение #118


Гуру
******

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



QUOTE (GetSmart @ Aug 31 2015, 13:49) *
То есть rvalue?

Не понял столь лаконично заданного "вопроса". Насколько я мог догадаться, то да, присваивание вырабатывает значение (таков СТАНДАРТ) и по этой причне может применяться указанным образом.
QUOTE
А почему адрес (&) можно брать через скобки или кучу скобок?

Можете и здесь нарисовать кучу скобок, но достаточно ОДНОЙ пары.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
ViKo
сообщение Aug 31 2015, 11:22
Сообщение #119


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

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



Значит, и на выражение while (c = 3) тоже будет предупреждение? А на while ((c = 3)) не будет?
Проверил - Кейл выдает и там и там, что, наверное, я хотел поставить ==.
Go to the top of the page
 
+Quote Post
zltigo
сообщение Aug 31 2015, 12:08
Сообщение #120


Гуру
******

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



QUOTE (ViKo @ Aug 31 2015, 14:22) *
Значит, и на выражение while (c = 3) тоже будет предупреждение? А на while ((c = 3)) не будет?

По хорошему и там и там, но разные. В первом случае то, что получили, во втором, что константное. Тяжелый труд у писателей компиляторов, особенно, кода надо о непонятках сообщать.


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post

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

 


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


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