Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
5 / 5 / 2
Регистрация: 29.08.2012
Сообщений: 46
1

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

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

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

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

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

 Комментарий модератора 
Тема вынесена из другой
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.03.2016, 23:27
Ответы с готовыми решениями:

WCF Data Services. В чем плюсы? И чем лучше или хуже простого Web-API?
Пытаюсь разобраться с WCF Data Services. Не совсем понимаю, для чего это нужно. В интернете мало...

Проверить правильность написания круглых скобок
Проверить правильность написания круглых скобок.питон

Необходимо проверить расстановок скобок на правильность написания
Необходимо проверить расстановок скобок.На правильность написания и исправить. Правильно (), Не...

В чем плюсы лямбд?
В чем очевидные и/или измеряемые плюсы лямбд в C++? Повышает ли это скорость кода? Или памяти...

27
1702 / 898 / 207
Регистрация: 25.11.2009
Сообщений: 1,847
09.03.2016, 19:45 2
Цитата Сообщение от Kvarcenar Посмотреть сообщение
if ((Edit9 -> Text) == "123") || (Edit9->Text == "12345"))
только со скобками беда. На три открывающие приходится четыре закрывающих. При том, что нужна всего-то одна пара, обрамляющая всё условие целиком.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
09.03.2016, 19:55 3
Цитата Сообщение от Lelik-pahan Посмотреть сообщение
При том, что нужна всего-то одна пара, обрамляющая всё условие целиком.
Ну, для того, чтобы это осознать, нужно же познакомиться с приоритетом операций, а кому это интересно?
0
5 / 5 / 2
Регистрация: 29.08.2012
Сообщений: 46
09.03.2016, 21:02  [ТС] 4
Цитата Сообщение от volvo Посмотреть сообщение
Ну, для того, чтобы это осознать, нужно же познакомиться с приоритетом операций, а кому это интересно?
Ой, да ладно! ))) Одна закрывающая после "Edit9 -> Text" лишняя... Очепятка... А операции беру в скобки, потому что так удобнее и читабельнее!
0
управление сложностью
1687 / 1300 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
09.03.2016, 21:06 5
Цитата Сообщение от Kvarcenar Посмотреть сообщение
А операции беру в скобки, потому что так удобнее и читабельнее!
Ошибочно так полагать. По той простой причине - скобки нужны для логики работы программы, т.е. для приоритетов исполнения, а не для того, что это удобно или читабельно.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32835 / 21172 / 8148
Регистрация: 22.10.2011
Сообщений: 36,431
Записей в блоге: 8
09.03.2016, 21:15 6
Цитата Сообщение от Kvarcenar Посмотреть сообщение
Очепятка...
Не брал бы в скобки - не было бы очепяток.
Цитата Сообщение от Kvarcenar Посмотреть сообщение
потому что так удобнее и читабельнее
Попробуй Лисп изучать. С такой любовью к скобкам - тебе понравится.
0
5 / 5 / 2
Регистрация: 29.08.2012
Сообщений: 46
09.03.2016, 21:15  [ТС] 7
Цитата Сообщение от Почтальон Посмотреть сообщение
скобки нужны для логики работы программы, т.е. для приоритетов исполнения, а не для того, что это удобно или читабельно.
В смысле? Ну, при отладке программы при раздуплении строки
C++
1
if (Edit9 -> Text == "123" && Edit9 -> Text == "12345" || Edit9 -> Text == "12345" && Edit9 -> Text == "12345")
я потрачу секунд на 5 больше времени, чем если запишу
C++
1
2
if (((Edit9 -> Text == "123")    && (Edit9 -> Text == "123456")) ||
    ((Edit9 -> Text == "12345") && (Edit9 -> Text == "123457")))
Или Вы хотите сказать, что в откомпилированном виде первый вариант будет исполняться быстрее второго? )))
0
управление сложностью
1687 / 1300 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
09.03.2016, 21:19 8
Цитата Сообщение от Kvarcenar Посмотреть сообщение
Или Вы хотите сказать, что в откомпилированном виде первый вариант будет исполняться быстрее второго?
Нет, я хочу сказать что: "Казнить нельзя помиловать"
0
случайный прохожий
2935 / 1951 / 606
Регистрация: 20.07.2013
Сообщений: 5,159
10.03.2016, 01:53 9
В скобки условия можно заключать для дальнейшей поддержки кода, вдруг условия поменяются, а с ними и приоритет. Плюс это исключает/сокращает трудноуловимые ошибки - все могут ошибиться.
Также замечал, что, например, некоторые ("авторитетные" в программировании люди) после for () ставят {}, даже если можно без этого обойтись.
1
управление сложностью
1687 / 1300 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
10.03.2016, 11:50 10
Цитата Сообщение от gunslinger Посмотреть сообщение
Также замечал, что, например, некоторые ("авторитетные" в программировании люди) после for () ставят {}, даже если можно без этого обойтись

Не по теме:

Ну это уже дело привычки

0
Lelik-pahan
10.03.2016, 16:55
  #11

Не по теме:

Для меня такой код трудночитаем:

Цитата Сообщение от Kvarcenar Посмотреть сообщение
C++
1
if (((Edit9 -> Text == "123") && (Edit9 -> Text == "123456")) ||  ((Edit9 -> Text == "12345") && (Edit9 -> Text == "123457")))
а тут всё понятно с первого взгляда:
C++
1
if (Edit9->Text == "123" && Edit8->Text == "123456" ||  Edit9->Text == "12345" && Edit8->Text == "123457")
Это как математическая формула. Можно записать так:
a * b + c * d
а можно так:
((a * b) + (c * d))
Только смысл? такая запись понятнее тем, кто только начал изучать действие "умножение" и не уверен, какую операцию нужно выполнять раньше.


Это дело привычки. Конечно пиши так, как тебе удобно. Но я уверен, что со временем ты сам придёшь к тому, что запись без лишних скобок удобней.

0
Практикантроп
4826 / 2718 / 526
Регистрация: 23.09.2011
Сообщений: 5,777
10.03.2016, 17:13 12
По моему тут нет "золотого" решения; я часто избегаю лишней писанины. В явных случаях, - когда мои "недомолвки" подправляет компилятор (или препроцессор) - стараюсь писать короче. Пример - Caption = 12345. Хотя корректнее, наверное, Caption = IntToStr(12345). Но бывает, что за такое пренебрежение точным стилем получаю "подзатыльники" в виде неверного результата. Толкового примера под рукой нет, но в основном это связано со сложными выражениями. И, вроде, по рангу мат.операций должно получиться нужное мне значение, а в результате - получаю не то, пока не "умащу" выражение кучей лишних на мой взгляд круглых скобок. Особенно, если в выражении присутствуют сдвиги, умножения и т.д.
2
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
10.03.2016, 21:40 13
Даешь лисп в плюсах!

За ради развлечения можно глянуть потроха dinkumware stl:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
template<class _FwdIt1,
    class _Diff2,
    class _Ty> inline
    _FwdIt1 _Search_n(_FwdIt1 _First1, _FwdIt1 _Last1,
        _Diff2 _Count, const _Ty& _Val, random_access_iterator_tag)
    {   // find first _Count * _Val match, random-access iterators
    _DEBUG_RANGE(_First1, _Last1);
    _FwdIt1 _Mid1;
 
    if (_Count == 0)
        return (_First1);
 
    for (;; _First1 = ++_Mid1)
        {   // look for a long enough sequence
        _FwdIt1 _Oldfirst1 = _First1;
        _Diff2 _Count1 = _Count;
 
        for (;; _First1 += _Count)
            if (_First1 == _Last1)
                return (_Last1);    // end of sequence
            else if (*_First1 == _Val)
                break;  // found a match
            else if (_Last1 - _First1 < _Count)
                return (_Last1);    // not enough left for a match
 
        _Mid1 = _First1;
        if (_Oldfirst1 != _First1)
            for (++_Oldfirst1; _Oldfirst1 != _First1; --_First1, --_Count1)
                if (!(_First1[-1] == _Val))
                    break;  // found beginning of sequence
 
        for (;; )
            if (--_Count1 == 0)
                return (_First1);   // found last match
            else if (_Mid1 == _Last1 || !(*++_Mid1 == _Val))
                break;
        if (_Mid1 == _Last1)
            return (_Last1);
        }
    }
- буста:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
  BOOST_concept(AdaptableBinaryFunction,(Func)(Return)(First)(Second))
    : BinaryFunction<
          Func
        , typename Func::result_type
        , typename Func::first_argument_type
        , typename Func::second_argument_type
      >
  {
      typedef typename Func::first_argument_type first_argument_type;
      typedef typename Func::second_argument_type second_argument_type;
      typedef typename Func::result_type result_type;
 
      ~AdaptableBinaryFunction()
      {
          BOOST_CONCEPT_ASSERT((Convertible<result_type, Return>));
          BOOST_CONCEPT_ASSERT((Convertible<First, first_argument_type>));
          BOOST_CONCEPT_ASSERT((Convertible<Second, second_argument_type>));
      }
  };
///////////////////////////////////////////////////////////////////////////////
template<typename T, typename C>
inline auto_any<BOOST_DEDUCED_TYPENAME foreach_iterator<T, C>::type>
end(auto_any_t col, type2type<T, C> *, boost::mpl::false_ *) // lvalue
{
    typedef BOOST_DEDUCED_TYPENAME type2type<T, C>::type type;
    typedef BOOST_DEDUCED_TYPENAME foreach_iterator<T, C>::type iterator;
    return auto_any<BOOST_DEDUCED_TYPENAME foreach_iterator<T, C>::type>(
        iterator(boost::end(derefof(auto_any_cast<type *, boost::mpl::false_>(col)))));
}
- и VCL:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
  BSTR __fastcall WideString::Copy(BSTR src)
  {
    return (src) ? ::SysAllocStringLen(src, ::SysStringLen(src)) : 0;
  }
///////////////////////////////////////////////////////////////////////////////
  static int UTF32ToUTF16(const char32_t* src, WideChar* dst, int len)
  {
    int count = 0;
    while ((len != 0) && *src) {
      char32_t ch = *src++;
      if (ch < 0x0000FFFF) {
        count++;
        if (dst)
          *dst++ = (ch & 0x0000FFFF);
      }
      else if (ch < 0x0010FFFF) {
        count += 2;
        if (dst) {
          ch -= 0x10000;
          *dst++ = (ch >> 10)  | 0xD800;
          *dst++ = (ch & 0x3FF)| 0xDC00;
        }
      } else {
        count++;
        if (dst)
          *dst++ = 0x0000FFFD;
      }
      if (len > 0)
        len--;
    }
    return count;
  }
Приглашаю страждущих заодно поплеваться на разработчиков библиотек. Плохие разработчики, плохие, а-та-та!))
1
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
10.03.2016, 22:13 14
Что-то в приведенных выше примерах не нашел особо громоздких условий в пределах одного оператора if, о которых в этой теме идет речь...

Цитата Сообщение от Kvarcenar Посмотреть сообщение
Ну, при отладке программы при раздуплении строки
C++
1
if (((Edit9 -> Text == "123") && (Edit9 -> Text == "123456")) ||  ((Edit9 -> Text == "12345") && (Edit9 -> Text == "123457")))
или
C++
1
if (Edit9->Text == "123" && Edit8->Text == "123456" ||  Edit9->Text == "12345" && Edit8->Text == "123457")
Если приводите примеры - то хотя бы приводите реальные. Оба условия можно просто заменить на
C++
1
if (false)
О чем тут говорить то.

Я к тому, что большинство таких ужасных на взгляд условий можно переписать куда короче и нагляднее. Тут речь уже даже не о скобках...
0
4043 / 2332 / 292
Регистрация: 03.02.2011
Сообщений: 5,066
Записей в блоге: 10
10.03.2016, 22:32 15
Цитата Сообщение от pav1uxa Посмотреть сообщение
Если приводите примеры - то хотя бы приводите реальные.
Тема вынесена из другой. Никто не ставил целью привести реальный или нереальный пример кода - обсуждение понеслось само собой.
0
1702 / 898 / 207
Регистрация: 25.11.2009
Сообщений: 1,847
11.03.2016, 09:37 16
Цитата Сообщение от pav1uxa Посмотреть сообщение
Если приводите примеры - то хотя бы приводите реальные
Посмотри внимательно на второй пример. Когда я его писал, я убрал лишние скобки, лишние пробелы и в двух случаях заменил Edit9 на Edit8, так что его нельзя заменить на if (false)
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
12.03.2016, 17:35 17
Цитата Сообщение от gunslinger Посмотреть сообщение
В скобки условия можно заключать для дальнейшей поддержки кода, вдруг условия поменяются
плохой ход.

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

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

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

Цитата Сообщение от gunslinger Посмотреть сообщение
Плюс это исключает/сокращает трудноуловимые ошибки - все могут ошибиться.
приведите пример ошибки,
которая не будет выявлена на первом же прогоне тестов.
Цитата Сообщение от BRcr Посмотреть сообщение
Приглашаю страждущих заодно поплеваться на разработчиков библиотек.
вполне себе годный код.
с чего там плеваться то?
0
случайный прохожий
2935 / 1951 / 606
Регистрация: 20.07.2013
Сообщений: 5,159
13.03.2016, 01:36 18
приведите пример ошибки,
которая не будет выявлена на первом же прогоне тестов.
"Запутался" в приоритете операций (сложное условие) и потом сидишь, голову ломаешь, почему результат не соответствует ожиданиям.
Лишние скобки, считаю, могут помочь в дальнейшей поддержке кода - люди разные бывают, не у всех "основы" запоминаются, как дважды два.
0
1943 / 1768 / 825
Регистрация: 23.01.2014
Сообщений: 6,230
13.03.2016, 10:11 19
По мне так "сложное условие" - это уже само по себе явление неверное, его не должно существовать. Ну не бывает в реальном коде вот таких трехэтажных условий. Его разделяют на несколько простых. Иначе как Вы вообще его дебажить будете? Экономия строк в коде еще никогда никому не помогала.

А приведенное в теме сравнение со строками так это вообще что-то с чем-то. Ну не будет такого в практическом коде никогда...
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
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
13.03.2016, 14:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.03.2016, 14:05
Помогаю со студенческими работами здесь

На чем легче писать игры? плюсы и минусы
Народ,а как вы думаете/имели опыт на чем легче писать игры, и насколько хорошо возможно потом будет...

В чём плюсы и минусы жестких и символьных ссылок?
пожалуйста, подскажите в чем минусы и плюсы жестких и символьных ссылок в линуксе? что нельзя...

В чем плюсы Map перед обычными объектом
Можете подсказать? В чем преимущества Map перед обычным объектом, помимо того что Map принимает в...

В чем плюсы использования автоматически реализуемых свойств?
В чем плюсы использования автоматически реализуемыех свойств?ведь они ничем не отличаются от...

Разработка мобильного приложения на Delphi XE - в чем плюсы и минусы?
Стоит ли писать приложения под мобильные платформы на Delphi XE ? Если true, тогда какие...

Выбор IDE. Кому в чем больше нравиться работать, плюсы и минусы?
Добрый день. Этот вопрос задавался уже тут много раз, про Ide, но я спрошу по другому, кому в...

В чем разница между сетевым мостом и NAT, какие плюсы и минусы?
В чем различия между сетевым мостом и NAT, какие плюсы и минусы они имеют? И какой из них лучше и...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru