Jump to content

    
Sign in to follow this  
ViKo

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

Recommended Posts

Just now, ViKo said:

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

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

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

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
37 minutes ago, Сергей Борщ said:

y = ax+b

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

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

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

 

 

Share this post


Link to post
Share on other sites
5 минут назад, Forger сказал:

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

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

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

Цитата

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

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

 

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

Share this post


Link to post
Share on other sites
16 minutes ago, jcxz said:

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

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

 

Quote

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

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

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

 

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

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

 

Share this post


Link to post
Share on other sites
3 минуты назад, yes сказал:

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

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

Share this post


Link to post
Share on other sites

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

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

Раньше тоже функции писал полными названиями, типа 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:

Share this post


Link to post
Share on other sites
21 минуту назад, Forger сказал:

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

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

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

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

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

Share this post


Link to post
Share on other sites
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;
}

 

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
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:

Глобальным 

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this