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

C++

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

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

05.03.2016, 23:27. Просмотров 599. Ответов 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
1170 / 738 / 70
Регистрация: 25.11.2009
Сообщений: 1,489
Завершенные тесты: 1
09.03.2016, 19:45 #2
Цитата Сообщение от Kvarcenar Посмотреть сообщение
if ((Edit9 -> Text) == "123") || (Edit9->Text == "12345"))
только со скобками беда. На три открывающие приходится четыре закрывающих. При том, что нужна всего-то одна пара, обрамляющая всё условие целиком.
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
23650 / 15650 / 4696
Регистрация: 22.10.2011
Сообщений: 27,744
Записей в блоге: 5
09.03.2016, 19:55 #3
Цитата Сообщение от Lelik-pahan Посмотреть сообщение
При том, что нужна всего-то одна пара, обрамляющая всё условие целиком.
Ну, для того, чтобы это осознать, нужно же познакомиться с приоритетом операций, а кому это интересно?
0
Kvarcenar
5 / 5 / 1
Регистрация: 29.08.2012
Сообщений: 46
09.03.2016, 21:02  [ТС] #4
Цитата Сообщение от volvo Посмотреть сообщение
Ну, для того, чтобы это осознать, нужно же познакомиться с приоритетом операций, а кому это интересно?
Ой, да ладно! ))) Одна закрывающая после "Edit9 -> Text" лишняя... Очепятка... А операции беру в скобки, потому что так удобнее и читабельнее!
0
Почтальон
Модератор
387 / 314 / 57
Регистрация: 22.03.2015
Сообщений: 2,448
Завершенные тесты: 1
09.03.2016, 21:06 #5
Цитата Сообщение от Kvarcenar Посмотреть сообщение
А операции беру в скобки, потому что так удобнее и читабельнее!
Ошибочно так полагать. По той простой причине - скобки нужны для логики работы программы, т.е. для приоритетов исполнения, а не для того, что это удобно или читабельно.
0
volvo
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
23650 / 15650 / 4696
Регистрация: 22.10.2011
Сообщений: 27,744
Записей в блоге: 5
09.03.2016, 21:15 #6
Цитата Сообщение от Kvarcenar Посмотреть сообщение
Очепятка...
Не брал бы в скобки - не было бы очепяток.
Цитата Сообщение от Kvarcenar Посмотреть сообщение
потому что так удобнее и читабельнее
Попробуй Лисп изучать. С такой любовью к скобкам - тебе понравится.
0
Kvarcenar
5 / 5 / 1
Регистрация: 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
Почтальон
Модератор
387 / 314 / 57
Регистрация: 22.03.2015
Сообщений: 2,448
Завершенные тесты: 1
09.03.2016, 21:19 #8
Цитата Сообщение от Kvarcenar Посмотреть сообщение
Или Вы хотите сказать, что в откомпилированном виде первый вариант будет исполняться быстрее второго?
Нет, я хочу сказать что: "Казнить нельзя помиловать"
0
gunslinger
случайный прохожий
1137 / 755 / 192
Регистрация: 20.07.2013
Сообщений: 2,082
10.03.2016, 01:53 #9
В скобки условия можно заключать для дальнейшей поддержки кода, вдруг условия поменяются, а с ними и приоритет. Плюс это исключает/сокращает трудноуловимые ошибки - все могут ошибиться.
Также замечал, что, например, некоторые ("авторитетные" в программировании люди) после for () ставят {}, даже если можно без этого обойтись.
1
Почтальон
Модератор
387 / 314 / 57
Регистрация: 22.03.2015
Сообщений: 2,448
Завершенные тесты: 1
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
nick42
Практикантроп
4105 / 2139 / 198
Регистрация: 23.09.2011
Сообщений: 4,541
10.03.2016, 17:13 #12
По моему тут нет "золотого" решения; я часто избегаю лишней писанины. В явных случаях, - когда мои "недомолвки" подправляет компилятор (или препроцессор) - стараюсь писать короче. Пример - Caption = 12345. Хотя корректнее, наверное, Caption = IntToStr(12345). Но бывает, что за такое пренебрежение точным стилем получаю "подзатыльники" в виде неверного результата. Толкового примера под рукой нет, но в основном это связано со сложными выражениями. И, вроде, по рангу мат.операций должно получиться нужное мне значение, а в результате - получаю не то, пока не "умащу" выражение кучей лишних на мой взгляд круглых скобок. Особенно, если в выражении присутствуют сдвиги, умножения и т.д.
2
BRcr
4008 / 2297 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 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
pav1uxa
1829 / 1680 / 638
Регистрация: 23.01.2014
Сообщений: 6,041
Завершенные тесты: 1
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
BRcr
4008 / 2297 / 155
Регистрация: 03.02.2011
Сообщений: 5,064
Записей в блоге: 10
10.03.2016, 22:32 #15
Цитата Сообщение от pav1uxa Посмотреть сообщение
Если приводите примеры - то хотя бы приводите реальные.
Тема вынесена из другой. Никто не ставил целью привести реальный или нереальный пример кода - обсуждение понеслось само собой.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.03.2016, 22:32
Привет! Вот еще темы с ответами:

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;- чтобы рабочий стол создался не в...


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
10.03.2016, 22:32
Ответ Создать тему
Опции темы

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