Перейти к содержанию
    

Не компилируется &&= в C++

3 minutes ago, ViKo said:

Я понимаю, что хочу написать.

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Just now, ViKo said:

Я понимаю, что хочу написать.

Да по-началу, пока код еще в процессе создания и многое в голове, все именно так и происходит, но проходят дни-месяцы-годы и читать эти шифровки становится весьма затруднительно.

В одиночку это еще куда ни шло, особенно если память хорошая, но, если код пишут не в одиночку, то это становится головной болью всех, кто участвует в проекте :mda:

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сам пишу, сам читаю. Всё понимаю. Если сомневаюсь, смотрю в справочный файл. Сомнения берут, когда операторы >> и + использую, и то редко. В остальном - никакого дискомфорта, только удовольствие от написанного.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

К чему споры? Неспособный запомнить элементарное может писать со скобками y = ax+b. И никто ему это запретить не сможет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

37 minutes ago, Сергей Борщ said:

y = ax+b

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

Поэтому выражения становятся длинные и без доп. скобок или разбиения выражений на несколько более простых уже не обойтись.

Лишь в конкретно примитивных выражениях или для отладки есть смысл применять подобные абстрактные математически символы.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 минут назад, Forger сказал:

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

"Не надо говорить за всех".

Пишут. И по моим наблюдениям - большинство. Всегда использую короткие (одно-, двух-символьные имена для локальных общих переменных внутри функций). Так удобнее.

Цитата

Поэтому выражения становятся длинные и без доп. скобок или разбиения выражений на несколько более простых уже не обойтись.

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

 

PS: И чрезмерное количество скобок там где не нужно - тоже снижает читаемость кода. Мне кажется - среднему человеку вполне по силам запомнить приоритеты нескольких операций.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

16 minutes ago, jcxz said:

Пишут. И по моим наблюдениям - большинство. 

Сами виноваты ))

 

Quote

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

Портянка - портянке рознь. Порой стремясь упростить одно, значительно усложняется совсем другое.

Конечно, исключение могут составлять откровенно примитивные циклы в одну строку, выражения, которые имеют крайне малую область видимости и т. п.

 

Пример: https://habr.com/ru/post/145850/ (см раздел "Качественные переменные", "Индексы циклов").

Книга называется: "Code Complete: A Practical Handbook of Software Construction".

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 минуты назад, yes сказал:

для && еще важно, что он может и не исполнять один из операндов

Вот именно поэтому, наверное, и не существует короткой записи "&&=". И более правильно говорить не "один из", а "второй", потому что порядок вычисления операндов для этого оператора строго определен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я тоже за короткие названия и не пестрящий скобками код.

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

Раньше тоже функции писал полными названиями, типа TestStartSemaphoreHandle... Сейчас же стараюсь очень кратко и лаконично...

Например, так

s32 rb_Read(sRB *RB, u8 Buf[], s32 Len)
{
  s32 RLen; BusySpace(RLen); if(RLen > Len) RLen = Len;
  for(s32 i = 0, j = RB->RP; i < RLen; ++i, RB->RP = ++j)
    Buf[i] = RB->Buf[j &= (j - RB_BUFFER_SIZE) >> 31];
  return RLen;
}

 

Коротко и понятно:wink:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

21 минуту назад, Forger сказал:

Так уже практически никто не пишет.

Это был утрированный пример элементарного выражения, приоритет операций в котором известен каждому школьнику старше второго класса.

1 минуту назад, Arlleex сказал:

Коротко и понятно

Даже после просмотра кода не понял, что означает "rb" в названии функции. Так что стараюсь давать полные, но не сильно длинные названия функциям. Максимум из двух слов. Остальное вкладываю в имя объекта.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

36 minutes ago, Forger said:

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

+1. Я тоже скобки расставляю. Чистая арифметика, конечно, не в счёт.

34 minutes ago, jcxz said:

Всегда использую короткие

А как вы читаете код спустя время? Ведь нужно трассировать переменную глазками от места использования, чтобы понять, что она значит. Если давать комментарии в месте объявления, то это тоже загромождает исходник.

18 minutes ago, Arlleex said:

Коротко и понятно:wink:

Простите, но нет:blum: Скажу сразу, ни в коем случае не критикую и не претендую на звание кодописателя))))

Мне очень трудно читать код, когда на одной строке сразу несколько выражений.

Вот мои примеры. Но у меня переборы с длинными именами и "нэймспэйсами". В будущем этот код немного сократится. А так, стараюсь не сокращать имена переменным и функциям, а писать, по-возможности, короткие функции, чтобы помещались на экран. Хотя, в целом, писать код красиво, эффективно, и, самое главное, рабочий - это высшее искусство. пока мною недостигнутое. Но работает, уже хорошо)))))))))))))))))))))

Debug::Errno::Error Drv::Lpc4337Uart::write( const void * _src, std::uint32_t _size, std::uint32_t _tm_ms )  {
    FFWK_ASSERT(_src);
    FFWK_ASSERT(_size);
    auto number = static_cast<std::uint32_t>(getDescription().number);
    Os::Mutex::Service mt(m_uart[number].mutex);
    FFWK_ASSERT(mt.take(300));
    m_uart[number].txSrc = static_cast<const std::uint8_t *>(_src);
    m_uart[number].txSize = _size;
    m_uart[number].regs->THR = *m_uart[number].txSrc++;
    if (--m_uart[number].txSize) {
        enableInterrupt(IrqSource::Thre);
        return m_uart[number].rxSignal.wait(300);
    }
    return Debug::Errno::Error(Debug::Errno::Code::Ok);
}

 

Debug::Errno::Error Drv::Lpc4337Uart::open() {
    auto result = Debug::Errno::Error(Debug::Errno::Code::Ok);
    const auto number = getDescription().number;
    const bool uartNumCheck = number == Number::N0 ||
                              number == Number::N1 ||
                              number == Number::N2 ||
                              number == Number::N3;
    FFWK_ASSERT(uartNumCheck);
    return result;
}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Локальным переменным даю имена предпочтительно 4-буквенные. Достаточно информативные и не длинные. Кроме индексов цикла или массива.

Глобальным - более длинные, в PascalStyle. Но они становятся похожими на имена фунций. Здесь еще в поиске. 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Сергей Борщ said:

Так что стараюсь давать полные, но не сильно длинные названия функциям. Максимум из двух слов. Остальное вкладываю в имя объекта.

+1 При сложной иерархии объектов для избегания имен из многих слов структурирую данных, разбивая их на блок из struct:

// Создание объекта  внутри некого класса
// безымянная структура, поскольку используется только для одного объекта
		struct
		{
			RotaryEncoderAdvanced<float, PD8, PD9, PB15> encoder;
			ChannelIndex channelIndex;
			float actualMoisture;
			float minMoisture;
			float maxMoisture;
			float minOutput;
			float maxOutput;
			float outputPolarity;
			float actualOutput;
			float moistureSlope;
			float outputSlope;
			float coeff;
			float step;
			bool isActive;
		} pump;

// Применение внутри одного из методов класса, которому принадлежит этот объект
	pump.encoder.setStepsPerClick(pump.step);
	pump.encoder.setMinValue(pump.minMoisture);
	pump.encoder.setMaxValue(pump.maxMoisture);
	pump.encoder.setValue(pump.actualMoisture);
	pump.moistureSlope = pump.maxMoisture - pump.minMoisture;
	pump.outputSlope = pump.maxOutput - pump.minOutput;
	pump.coeff = pump.outputSlope / pump.moistureSlope;

 

Или вот еще вложенное, тоже безымянная структура, один объект (в секции private):

		struct
		{
			struct 
			{
				float mileageKm;
				float materialKg[kMaterialsTotal];
				float workingTimeHr;
			} daily;
			
			struct 
			{
				float mileageKm;
				float materialKg[kMaterialsTotal];
				float workingTimeHr;
			} total;
		} statistics;

 

46 minutes ago, haker_fox said:

Debug::Errno::Error Drv::Lpc4337Uart::write

Стараюсь использовать using (та, что вместо typedef) для типов, которые слишком длинные, строго ограничивая их область видимости. 

 

2 minutes ago, ViKo said:

Глобальным 

Похвастаю ))) Давно отказался от них, стало гораздо проще управлять проектом (в смысле объектами внутри него и их взаимодействием).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...