Форум программистов, компьютерный форум, киберфорум
Наши страницы

C++

Войти
Регистрация
Восстановить пароль
 
 
Kvarcenar
5 / 5 / 1
Регистрация: 29.08.2012
Сообщений: 46
#1

Целесообразность написания дополнительных скобок или "с чем плюсы вкуснее?" - C++

05.03.2016, 23:27. Просмотров 639. Ответов 27
Метки нет (Все метки)

Ну, Вам правильно ответили, но второе условие и так будет исполняться. Т.е. если текст не пустой, то будет срабатывать любое из значений, а не только "12345". Так что делайте так:

C++ (Qt)
1
if ((Edit9 -> Text) == "123") || (Edit9->Text == "12345"))
Так логичнее )))

PS: для "и" вместо "или" используется && вместо ||

 Комментарий модератора 
Тема вынесена из другой
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.03.2016, 23:27
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Целесообразность написания дополнительных скобок или "с чем плюсы вкуснее?" (C++):

О "нестабильности" или "переполнении" цикла foreach - C++
Здравствуйте, коллеги. Недавно коллега-программист сообщил мне страшную вещь: оказывается, что цикл foreach может переполниться при...

Необработанное исключение в "0x77913ab3" в "x": 0xC0000005: Нарушение прав доступа при чтении "0xdddddddd" - C++
вот код, нужно найти 3 минимальных положительных числа в массиве. При размере массива больше 950 в конце заполнения рандомным способом...

Как и на чем написать и скомпилировать программу, чтоб загружалась через bootmgr и выводить "hello world"? - C++
Ну что-то типа совсем простой ОС, если это можно так назвать.

Cтатическая линковка или "дайте _imp__func, а не __imp_func" - C++
написал DLL, собираю всё в MinGW Code::Blocks на выходе получаю файл func.a, func.def и func.dll внутри func.a три раза упоминается...

Найти в строке последовательность символов ("abcd") и заменить ее другой ("xyz") - C++
Найти в строке последовательность символов ("abcd") и заменить ее другой ("xyz").

Ошибка: invalid conversion from "int" to "SDL_RendererFlip" - C++
Скриншот приложен, Вот страница, откуда я брал этот код Подскажите что делать

27
Lelik-pahan
1186 / 754 / 80
Регистрация: 25.11.2009
Сообщений: 1,532
Завершенные тесты: 1
11.03.2016, 09:37 #16
Цитата Сообщение от pav1uxa Посмотреть сообщение
Если приводите примеры - то хотя бы приводите реальные
Посмотри внимательно на второй пример. Когда я его писал, я убрал лишние скобки, лишние пробелы и в двух случаях заменил Edit9 на Edit8, так что его нельзя заменить на if (false)
0
hoggy
6768 / 2953 / 509
Регистрация: 15.11.2014
Сообщений: 6,655
Завершенные тесты: 1
12.03.2016, 17:35 #17
Цитата Сообщение от gunslinger Посмотреть сообщение
В скобки условия можно заключать для дальнейшей поддержки кода, вдруг условия поменяются
плохой ход.

хороший ход: решать проблемы настоящего,
а не будущего, которое может и не наступить.

и потом, код пишется один раз, а потом много много раз читает.

избыток скобочек ухудшает читабельность.

Цитата Сообщение от gunslinger Посмотреть сообщение
Плюс это исключает/сокращает трудноуловимые ошибки - все могут ошибиться.
приведите пример ошибки,
которая не будет выявлена на первом же прогоне тестов.
Цитата Сообщение от BRcr Посмотреть сообщение
Приглашаю страждущих заодно поплеваться на разработчиков библиотек.
вполне себе годный код.
с чего там плеваться то?
0
gunslinger
случайный прохожий
1156 / 774 / 201
Регистрация: 20.07.2013
Сообщений: 2,163
13.03.2016, 01:36 #18
приведите пример ошибки,
которая не будет выявлена на первом же прогоне тестов.
"Запутался" в приоритете операций (сложное условие) и потом сидишь, голову ломаешь, почему результат не соответствует ожиданиям.
Лишние скобки, считаю, могут помочь в дальнейшей поддержке кода - люди разные бывают, не у всех "основы" запоминаются, как дважды два.
0
pav1uxa
1850 / 1703 / 645
Регистрация: 23.01.2014
Сообщений: 6,082
Завершенные тесты: 1
13.03.2016, 10:11 #19
По мне так "сложное условие" - это уже само по себе явление неверное, его не должно существовать. Ну не бывает в реальном коде вот таких трехэтажных условий. Его разделяют на несколько простых. Иначе как Вы вообще его дебажить будете? Экономия строк в коде еще никогда никому не помогала.

А приведенное в теме сравнение со строками так это вообще что-то с чем-то. Ну не будет такого в практическом коде никогда...
0
hoggy
6768 / 2953 / 509
Регистрация: 15.11.2014
Сообщений: 6,655
Завершенные тесты: 1
13.03.2016, 14:05 #20
Цитата Сообщение от gunslinger Посмотреть сообщение
"Запутался" в приоритете операций (сложное условие) и потом сидишь, голову ломаешь, почему результат не соответствует ожиданиям.
это не есть ответ на мой вопрос.

мой вопрос был:
Цитата Сообщение от hoggy Посмотреть сообщение
приведите пример ошибки,
которая не будет выявлена на первом же прогоне тестов.

выше вы вещали об ошибках, которые якобы сложно обнаружить.

однако, на практике только два варианта:
1.
либо оно вообще не скомпилиццо.

2.
ошибка в логических выражений - это ошибка бизнес логики.
такое не может быть незамеченным.

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

это не та вещь, из-за которой стоит заморачиваться.

Цитата Сообщение от gunslinger Посмотреть сообщение
Лишние скобки, считаю, могут помочь в дальнейшей поддержке кода - люди разные бывают, не у всех "основы" запоминаются, как дважды два.
чем проще код - тем лучше он читается людьми независимо от квалификации.
избыток синтаксиса всегда делает код сложнее.

Добавлено через 1 минуту
Цитата Сообщение от pav1uxa Посмотреть сообщение
Ну не бывает в реальном коде вот таких трехэтажных условий.
ещё как бывают.

Цитата Сообщение от pav1uxa Посмотреть сообщение
Его разделяют на несколько простых.
разделите пожалуйста на примере следующего кода:

C++
1
2
if ( A && B && C && D && !E)
    somehing();
0
pav1uxa
1850 / 1703 / 645
Регистрация: 23.01.2014
Сообщений: 6,082
Завершенные тесты: 1
13.03.2016, 15:10 #21
Цитата Сообщение от hoggy Посмотреть сообщение
разделите пожалуйста на примере следующего кода:
C++
1
2
if ( A && B && C && D && !E)
    somehing();
Я не о таких условиях говорил. Это как раз-таки нормальное условие имхо. Тут в скобках смысла не будет, даже если их поставить.
0
hoggy
6768 / 2953 / 509
Регистрация: 15.11.2014
Сообщений: 6,655
Завершенные тесты: 1
13.03.2016, 15:24 #22
Цитата Сообщение от pav1uxa Посмотреть сообщение
Я не о таких условиях говорил. Это как раз-таки нормальное условие имхо. Тут в скобках смысла не будет, даже если их поставить.
предполагалось, что A,B,C,D,F вы подставите какие то "замороченные выражения",
и проиллюстрируете профит разделения.
0
Kvarcenar
5 / 5 / 1
Регистрация: 29.08.2012
Сообщений: 46
13.03.2016, 16:31  [ТС] #23
Цитата Сообщение от hoggy Посмотреть сообщение
разделите пожалуйста на примере следующего кода:
Эх, вот, приходят на мыло уведомления о новых сообщениях - и читаю эту тему.. ))) Народу заняться нечем, и скобки обсуждают... )))) Неужели в откомпилированном виде исполняемый файл будет отличаться в зависимости от наличия/отсутствия скобок в условиях? По идее, компилятор должен привести все одинаковые условия к одному виду. Разве нет?

Но тут просят хитрое сложное условие из реальной жизни, чтоб без скобок ну никак... Дописываю торгового советника для форекса. Приведу пример обработки некоторого события:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 if (Market.VipeData.Layers[LayerN].Way == 1) // слой покупок
  if ((Compare(Market.VipeData.Layers[LayerN].Prices.TPwayPrice - 3.0 * Market.InputData.Terminal.MarketInfo.SPREAD_DOUBLE,
               Market.InputData.Terminal.MarketInfo.BID, Market.InputData.Terminal.MarketInfo.POINT_d10) >= 0) || // профит выше текущей цены как минимум на 3 спреда
      (Market.VipeData.Orders[Market.VipeData.Layers[LayerN].Orders.LastAccMartinNotLockedN].OrderID2 > 0)) // не первый накопительный
   if (Market.InputData.Terminal.MarketInfo.BID < Market.VipeData.Layers[LayerN].Prices.TPwayPrice) // рынок ниже уровня профита
    if (Compare(Market.VipeData.Orders[Market.VipeData.Layers[LayerN].Orders.LastAccMartinNotLockedN].OpenPrice + Market.InputData.Terminal.MarketInfo.POINT,
                Market.VipeData.Market.MinBidForAccMinMinutes, Market.InputData.Terminal.MarketInfo.POINT_d10) < 0) // нижняя волна выше трейлинга в 1 пп
     if (Compare(Market.VipeData.Orders[Market.VipeData.Layers[LayerN].Orders.LastAccMartinNotLockedN].OpenPrice + Market.InputData.Terminal.MarketInfo.POINT,
                 Market.InputData.Terminal.MarketInfo.BID - Market.InputData.Terminal.MarketInfo.STOPLEVEL_DOUBLE,
                 Market.InputData.Terminal.MarketInfo.POINT_d10) <= 0) // STOPLEVEL выдержан
      if (Market.VipeData.Layers[LayerN].Lots.MartinLotNotLocked > Market.VipeData.Layers[LayerN].Lots.CompensatorLotNotLocked) // лот мартина больше лота компенсаторов
       if (Market.InputData.Terminal.Bars[0].Signal.CanBuy) // есть сигнал на покупку
        if ((Market.InputData.Terminal.MarketInfo.ASK <= Market.VipeData.Layers[LayerN].Prices.StandardPriceForLastOrder) || // расстояние выдержано
            (Market.VipeData.Orders[Market.VipeData.Layers[LayerN].Orders.LastAccMartinNotLockedN].OrderID2 > 0)) // накопительный
         if (Market.VipeData.Orders[Market.VipeData.Layers[LayerN].Orders.LastAccMartinNotLockedN].Protected == false)
          if ((Market.VipeData.Layers[LayerN].Orders.LastCompensatorNotProtectedN != -1) && // есть незащищённые компенсаторы
              (Market.VipeData.Orders[Market.VipeData.Layers[LayerN].Orders.LastCompensatorNotProtectedN].OrderID2 ==
               Market.VipeData.Orders[Market.VipeData.Layers[LayerN].Orders.LastAccMartinNotLockedN].OrderID)) // у нашего ордера есть незащищённый компенсатор
           if (Market.VipeData.Orders[Market.VipeData.Layers[LayerN].Orders.LastCompensatorNotProtectedN].SecondsOfExisting <=
               Market.VipeData.Orders[Market.VipeData.Layers[LayerN].Orders.LastAccMartinNotLockedN].SecondsOfExisting) // и этот компенсатор младше нашего ордера
            if (Market.VipeData.Orders[Market.VipeData.Layers[LayerN].Orders.LastCompensatorNotProtectedN].Lot + Market.InputData.Terminal.MarketInfo.LOTSTEP_d10 <
                Market.VipeData.Orders[Market.VipeData.Layers[LayerN].Orders.LastAccMartinNotLockedN].Lot) // и лот компенсатора меньше лота нашего ордера
 {//...
 }
Страшно представить, как это записать в одно условие... Собственно, каждое новое "if" - это заменитель "&&". А вот там, где "или" - приходится писать со скобками.

Цитата Сообщение от hoggy Посмотреть сообщение
предполагалось, что A,B,C,D,F вы подставите какие то "замороченные выражения",
и проиллюстрируете профит разделения.
Ну, можно создать булевые переменные A,B,C,D,E,F, в них затолкать условия и выполнить проверку в точности, как в приведенном выражении:

Цитата Сообщение от hoggy Посмотреть сообщение
if ( A && B && C && D && !E) somehing();
Однако в таких случаях меня всегда мучает вопрос: "что лучше: усложнить условие или занять память новой переменной?". Ну, например, с точки зрения экономии ресурсов, как сделать лучше:

C++ (Qt)
1
2
3
int i = 5;
if (i + 1 > 3)
{...}
или

C++ (Qt)
1
2
3
4
int i = 5;
int j = i + 1;
if (j > 3)
{...}
С одной стороны, если таких условий будет несколько, то процессору будет легче выполнить одну операцию сложения, а потом кучу сравнений, чем в куче сравнений каждый раз проводить сложение. А с другой стороны, наша программа будет кушать больше оперативной памяти... В общем, я за скобки, если с ними читабельней!
0
hoggy
6768 / 2953 / 509
Регистрация: 15.11.2014
Сообщений: 6,655
Завершенные тесты: 1
13.03.2016, 17:01 #24
Цитата Сообщение от Kvarcenar Посмотреть сообщение
Неужели в откомпилированном виде исполняемый файл
выхлоп компилятора - трудности компилятора.
интерес представляет исходный код.

Цитата Сообщение от Kvarcenar Посмотреть сообщение
Страшно представить, как это записать в одно условие.
представленный вами пример кода - говнокода страшен сам по себе.

при таком подходе скобочки уже ничего не ухудшают.

Цитата Сообщение от Kvarcenar Посмотреть сообщение
Однако в таких случаях меня всегда мучает вопрос: "что лучше: усложнить условие или занять память новой переменной?". Ну, например, с точки зрения экономии ресурсов, как сделать лучше:
компиляторы уже давным давно научились оптимизировать промежуточные вычисления.
так что без разницы.

вопрос лишь в том: что читабельнее.

выше я привел пример условия:

C++
1
2
if ( A && B && C && D && !E)
    somehing();
условие может быть каким угодно, и сколько угодно сложным.
но его всегда можно свести вот к такому лаконичному виду.
вместо A,B,C,D,E можно подставить имена функций или макросов.

если формула истинности теряется в условии,
из-за обилия текста - это плохой код.

Добавлено через 1 минуту
Цитата Сообщение от Kvarcenar Посмотреть сообщение
В общем, я за скобки, если с ними читабельней!
ну да, если.

ваш код показывает, что вы боретесь с последствиями.
1
Kvarcenar
5 / 5 / 1
Регистрация: 29.08.2012
Сообщений: 46
13.03.2016, 17:11  [ТС] #25
Цитата Сообщение от hoggy Посмотреть сообщение
представленный вами пример кода - говнокода страшен сам по себе.
Ага, щаз с пенкой у рта буду защищать свой код от оскорблений, ждите.. ))))
Цитата Сообщение от hoggy Посмотреть сообщение
ваш код показывает, что вы боретесь с последствиями.
Ничего не борюсь. Для меня код читабельный. Всё разбито на функции и легко анализируется разработчиком. Просто как пример привёл. А если кого-то испугали не переменные типа i и j, а обращение к переменной внутри структуры с длинным названием - ну, извините ))))
0
pav1uxa
1850 / 1703 / 645
Регистрация: 23.01.2014
Сообщений: 6,082
Завершенные тесты: 1
13.03.2016, 17:55 #26
Цитата Сообщение от hoggy Посмотреть сообщение
предполагалось, что A,B,C,D,F вы подставите какие то "замороченные выражения",
и проиллюстрируете профит разделения.
Я говорю что так не делается, а Вы меня же просите придумать туда "замороченные выражения" и чего-то проиллюстрировать

Я имел ввиду как раз вот это:
Цитата Сообщение от hoggy Посмотреть сообщение
условие может быть каким угодно, и сколько угодно сложным.
но его всегда можно свести вот к такому лаконичному виду.
вместо A,B,C,D,E можно подставить имена функций или макросов.
0
hoggy
6768 / 2953 / 509
Регистрация: 15.11.2014
Сообщений: 6,655
Завершенные тесты: 1
13.03.2016, 18:26 #27
Цитата Сообщение от pav1uxa Посмотреть сообщение
Я говорю что так не делается, а Вы меня же просите придумать туда "замороченные выражения" и чего-то проиллюстрировать
выше человек наглядно продемонстрировал говнокод.

Цитата Сообщение от pav1uxa Посмотреть сообщение
Я имел ввиду как раз вот это:
ок.
0
pav1uxa
13.03.2016, 18:35     Целесообразность написания дополнительных скобок или "с чем плюсы вкуснее?"
  #28

Не по теме:

Цитата Сообщение от hoggy Посмотреть сообщение
говнокод.
Вот и я о том же...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.03.2016, 18:35
Привет! Вот еще темы с ответами:

CString buff = "aaa" + "bbb" - C++
Хочется одним оператором конкатенировать несколько подстрок CString buff = &quot;aaa&quot; + &quot;bbb&quot; компилятор выдает error C2110: cannot add two...

Qt Creator. Все "за" и "против" - C++
Доброго времени суток, форумчане! Сегодня задался вопросом использования такой IDE, как Qt Creator. Суть темы заключается в том, что я...

Ошибка " Is not a valid integer value " или " sqrt: DOMAIN error " - C++ Builder
Добрый день! Программа должна рассчитать 2-ю диагональ и затем площадь ромба. Но когда присваиваю d2 = Edit3-&gt;Text и s = Edit3-&gt;Text,...

Как указать функцию: "СreateDesktop (или CreateDesktopEx)" - чтобы рабочий стол создался не в "Полноэкранном режиме", а в билдерской форме (TForm)? - C++ Builder
Привет всем... 1 вопрос: Как указать функцию: &quot;СreateDesktop (или CreateDesktopEx)&quot;- чтобы рабочий стол создался не в...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.