В чем смысл "непривычных" записей?

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

Вернее, с какой целью они применяются?

Например: "x += y;   // эквивалент записи x = x + y; " (то же самое про вычитания, умножение и деление.)

Правая половинка понятна любому, у кого в школе по алгебре было >2 :) К левой половинке необходимо привыкать, кстати, с точки зрения начинающего она вообще ни о чем.  Полагаю, что финальный (машинный) код останется таким же как в одном случае, так и в другом. В чем подспудный смысл? В "особом статусе" крутого программиста, недоступном таким ламерам, как я?

PS: Это не крик души, не ирония, не возмущения, а просто для повышения образования (моего).

 

b707
Offline
Зарегистрирован: 26.05.2017

когда у вас имена типа x - то да. А когда имена переменных длиной полстраницы, а набираете вы это все в консольном редакторе типа vi - смысл сразу появляется

Гриша
Offline
Зарегистрирован: 27.04.2014

форма сокращенной записи:

а) - не плодить кучу переменных - сложить 2 числа и заменить одно из них результатом и т.п.

б) - меньше букавок

 

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

b707 пишет:

 А когда имена переменных длиной полстраницы.

Хмм¸ смысл в этом есть. Только вот имя перемнной действительно на полстраницы мало себе представляю. Тем не менее, аргумент.

Гриша
Offline
Зарегистрирован: 27.04.2014

Sonologist пишет:

b707 пишет:

 А когда имена переменных длиной полстраницы.

Хмм¸ смысл в этом есть. Только вот имя перемнной действительно на полстраницы мало себе представляю. Тем не менее, аргумент.

самый распространенный пример - unsigned long currentMillis, previousMillis = 0; и это просто 2 переменные ... встречались и полуметровые имена у некоторых 

или     byte CheckDevicePresent; - думаю ребята и более страшные примеры могут привести. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вопрос не имеет смысла, т.к. ничего неизвестно о типах задействованных переменных.

Logik
Offline
Зарегистрирован: 05.08.2014

Гриша пишет:

 - думаю ребята и более страшные примеры могут привести. 

Легко! У меня в многих проектах такого было аки грязи. Это не самое еще забористое, так под рукой просто.

static S_HAL_TIMESTAMP  m_StartTimeIdleScreenAfterTransportCardProcessWoTicketPrinting;
static BOOL             m_IsRunningTimerIdleScreenAfterTransportCardProcessWoTicketPrinting;
static BOOL             m_NeedSoundAfterTransportCardProcessWoTicketPrinting;
 
Меня не пинать, писали другие, я токо пальцем у виска вертел.
 
Проблема в том что автору все понятно, и доказать ему абсолютно ниче нельзя. 
 
По вопросу ТС - короткая запись просто короче, и это все преимущества.
Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Logik пишет:
и это все преимущества
В каких-то случаях все, а в каких-то не все, правильно было сказано в #5. Пока типов нет, а есть конь в вакууме, ответы будут такими же.

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

Logik пишет:

По вопросу ТС - короткая запись просто короче, и это все преимущества.

Вот это понятно новичку.

Выше приведенные примеры "длинных" имен переменных меня не убедили: не такие уж они и длинные, чтобы просто не копипастить их при написании строки. А таких, чтобы в ширину страницы не влезали - не встречалось даже у меня, когда я начинал писать на Бэйсике. По младости годов не умел грамотно пользоваться комментариями, поэтому называл переменные тупо так, что они собственно из себя и представляли. И все равно, длинее 10-12 (ну, 15!) символов они не были.

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

Ворота пишет:

Logik пишет:
и это все преимущества
В каких-то случаях все, а в каких-то не все, правильно было сказано в #5. Пока типов нет, а есть конь в вакууме, ответы будут такими же.

А что непонятно? Я же веду речь не о типах переменных, а о математических действиях с этими переменными. То есть не про Х или Y, а про +, -, +=, /= и т.д. между ними. Об чем сразу сказал в первом посте.

Logik
Offline
Зарегистрирован: 05.08.2014

Ну m_IsRunningTimerIdleScreenAfterTransportCardProcessWoTicketPrinting - 67символов. Старое ограничение длинны строки 80.

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

Друзья, я понял, что главное преимущество - экономия символов. Лапидарность - наше всё. В общем, можно дискуссию закрывать.

Гриша
Offline
Зарегистрирован: 27.04.2014

Sonologist пишет:

Logik пишет:

По вопросу ТС - короткая запись просто короче, и это все преимущества.

Вот это понятно новичку.

Выше приведенные примеры "длинных" имен переменных меня не убедили: не такие уж они и длинные, чтобы просто не копипастить их при написании строки. А таких, чтобы в ширину страницы не влезали - не встречалось даже у меня, когда я начинал писать на Бэйсике. По младости годов не умел грамотно пользоваться комментариями, поэтому называл переменные тупо так, что они собственно из себя и представляли. И все равно, длинее 10-12 (ну, 15!) символов они не были.

просто профессиональная лень и все... зачем писать лишнее когда автору и так ясно, что он этим хочет сказать (я про сокращенную запись)

UPD главное что автор и компилятор друг-друга понимают

Logik
Offline
Зарегистрирован: 05.08.2014

//А что непонятно? Я же веду речь не о типах переменных

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

Logik
Offline
Зарегистрирован: 05.08.2014

Гриша пишет:

просто профессиональная лень и все... зачем писать лишнее когда автору и так ясно, что он этим хочет сказать (я про сокращенную запись)

Меньше букв - меньше ошибок. Профессиональная поговорка.

Гриша пишет:

UPD главное что автор и компилятор друг-друга понимают

Именно это и есть главный критерий.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Sonologist пишет:

А что непонятно? Я же веду речь не о типах переменных

Именно в этом Ваша беда. В программировании нельзя вести речь об операциях без привязки к типам - это бессмыслица - конь в вакууме. Поэтому, повторяю, вопрос полностью лишён смысла.

И дело тут вовсе не в том, что

Logik пишет:
можно перегрузить

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

Впрочем, если типы Вам пофиг, то действительно, расслабьтесь и

Logik пишет:
не бейте себе бошку об тяжелое.

Гриша
Offline
Зарегистрирован: 27.04.2014

Ремарка...

ЕвгенийП пишет:

Sonologist пишет:

А что непонятно? Я же веду речь не о типах переменных

Именно в этом Ваша беда. В программировании нельзя вести речь об операциях без привязки к типам - это бессмыслица - конь в вакууме. Поэтому, повторяю, вопрос полностью лишён смысла.

Лично я писал про тот случай, кода есть выбор как записать - запиши так, как короче (если понимаешь, что пишешь)

типа: i++ (в for к примеру) уже никого в ступор не вводит и я давно не видел записи {y = i + 1; i=y;}  :)))))))

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

Гриша пишет:

 я давно не видел записи {y = i + 1; i=y;}  :)))))))

Грешен я, Гриш! Я тоже единичку плюсую и вычитаю ++ или -- :) Это первый шаг к программистскому шику? :) 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Гриша, у Вас есть очень важная ремарка

Гриша пишет:
если понимаешь, что пишешь
а вот с этим как раз проблема, если типов переменных не знать. Я пытаюсь объяснить это автору поста, но, похоже, вопрос был задан не для того, чтобы получить новые знания, а для того, чтобы получить подтверждение своему предположению. Получено - можно тему закрывать :)

Sonologist
Sonologist аватар
Offline
Зарегистрирован: 08.06.2018

ЕвгенийП пишет:

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

Да, это так. Тему можно закрывать.

Гриша
Offline
Зарегистрирован: 27.04.2014

Тема закрыта, но "show must go on "

Sonologist пишет:

Гриша пишет:

 я давно не видел записи {y = i + 1; i=y;}  :)))))))

Грешен я, Гриш! Я тоже единичку плюсую и вычитаю ++ или -- :) Это первый шаг к программистскому шику? :) 

Нет это из области 3x5=15 или 5+5+5=15 или 3+3+3+3+3=15 - вы ведь не задумываетесь, что Умножение рассматривается как нахождение суммы одинаковых слагаемых? (2 класс)

Надеюсь сейчас Вы посмотрите на некоторые вещи с такого угла зрения - это нужно знать, понимать, но ни в коем случае не заморачиваться... :)

Гриша
Offline
Зарегистрирован: 27.04.2014

словоблудие.... есть минутка :))))

все помнят равенство?! х=у+1 == х-1=у. Как в школе говорят: "переносим и меняем знак" 

ИМХО это в корне не верный посыл к теме равенства и когда я учил сына (школьную тему проходили) я добивался, чтобы он понял - равенство это весы. Вес в левой и правой части можно умножить, разделить, вычесть или добавить ОДИНАКОВОЕ (константу или выражение и даже переменную). Для понимания в момент обучения я заставлял записывать равенство в виде:

х=у+1 == х-1= у+1-1 а потом выполнять арифметическое действие. 

потом это облегчило усвоение дробных равенств...

negavoid
Offline
Зарегистрирован: 09.07.2016

Строго говоря, оператор = это оператор присваивания, а не знак равенства из алгебры. Поэтому x += y легко трактовать, как присваивание иксу себя самого с добавлением игрека, как по мне, так это проще, чем в алгебре. А х=+у нельзя записывать, поскольку это просто х = (положительный) у.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Примерно как ADD EAX, 0x01

вместо  INC   EAX

b707
Offline
Зарегистрирован: 26.05.2017

ЕвгенийП пишет:

 как раз проблема, если типов переменных не знать. Я пытаюсь объяснить это автору поста, но, похоже, вопрос был задан не для того, чтобы получить новые знания, а для того, чтобы получить подтверждение своему предположению. Получено - можно тему закрывать :)

Евгений, а можно не для ТС. а хотя бы для тех, кому интересно - намекнуть, как влияют типы переменных на результат этих операций?

(кроме случая перегрузки операторов)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, я могу привести пример (один из 100500 возможных).

Дело в том, что в общем случае в левой части операции присваивания может стоять нечто вычисляемое (простейший пример - разыменование указателя, чуть более сложный - функтор или там лямбда). В этом случае при варианте "+=" это выражение будет вычисляться один раз, а при использовании "=" - два раза (один раз для правой части, а второй раз для левой) да ещё и непонятно в каком порядке. Вот простейший пруф. этих слов. Совсем простейший, чтобы показать только факт одинарного и двойного расчёта, смысла в программе нет никакого:

Случай "="

#include <Printing.h>

#define currentDuck	getDuck()

static int duck = 2;

int & getDuck(void) {
	printf("Calculate duck\r\n");
	return duck;
}

void setup(void) {
	Serial.begin(57600);
	printf("duck=%d\r\n", duck);
	currentDuck = currentDuck + 1;
	printf("duck=%d\r\n", duck);
}

void loop(void){}

// В мониторе видим два вызова getDuck
//
// duck=2
// Calculate duck
// Calculate duck
// duck=3

Случай "+="

#include <Printing.h>

#define currentDuck	getDuck()

static int duck = 2;

int & getDuck(void) {
	printf("Calculate duck\r\n");
	return duck;
}

void setup(void) {
	Serial.begin(57600);
	printf("duck=%d\r\n", duck);
	currentDuck += 1;
	printf("duck=%d\r\n", duck);
}

void loop(void){}

// В мониторе видим один вызов getDuck
//
// duck=2
// Calculate duck
// duck=3

Т.е., разницу Вы видите.

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

Более жизненные примеры будут посложнее, но принцип Вы поняли, жизненное можете и сами придумать. Ну, как пример: допустим эта getDuck возвращает пин(порт) на которые надо выводить что-то, чередуя пины(порты) по очереди - в результате двойного выполнения она будет пропускать каждый нечётный, так ведь?

Алексей.
Алексей. аватар
Offline
Зарегистрирован: 02.02.2018

Гриша пишет:
типа: i++ (в for к примеру) уже никого в ступор не вводит и я давно не видел записи {y = i + 1; i=y;}  :)))))))
Иногда в ступор вводят запятые в выражениях ;)

int x = 0;
void func1() {
	x = rand();
}
int main(void) {
	if (func1() , (x % 2)) {
		puts("odd");
	} else {
		puts("even");
	}
	return 0;
}

 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

С присваиванием ещё вот так прикольно

// #1
*s++ += 10;

// #2
*s++ = *s++ + 10;

:-)

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Sonologist пишет:

Гриша пишет:

 я давно не видел записи {y = i + 1; i=y;}  :)))))))

Грешен я, Гриш! Я тоже единичку плюсую и вычитаю ++ или -- :) Это первый шаг к программистскому шику? :) 

а как вы вычитаете и плюсуте --x, --y или x++,y++ ??? ;-)))

Чечако
Offline
Зарегистрирован: 15.06.2018

Гриша пишет:

типа: i++ (в for к примеру) уже никого в ступор не вводит и я давно не видел записи {y = i + 1; i=y;}  :)))))))

Вот, кстати, что любопытно. Если "++" и "--" я использую давно и автоматически, то "+=" и "-=" не прижились. Знаю, но не нравится. Но я замшелый, я до сих пор предпочту написать if(flag==true), нежели if(flag), мне так более читаемо.

negavoid
Offline
Зарегистрирован: 09.07.2016

Да непринципиально, как именно писать :) Лишь бы все остальные в команде писали в том же самом стиле и понимали его. С форматированием проще, используется обычно то, которое по умолчанию в основном редакторе кодерков компании, а вот с таким вот приходится иногда подпинывать, чтобы все соблюдали общий стиль, либо везде +=, либо везде х = х+у, это весьма помогает, когда строк кода много.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

negavoid пишет:

Да непринципиально, как именно писать :) 

Я тоже так считаю, но если включить перфекциониста, то префиксные операции эффективнее. В простейших случаях оптимизатор всё разрулит, но в целом - эффективнее. Садман много про это читал и нам здесь рассказывал что там и как, поищите на форуме.

b707
Offline
Зарегистрирован: 26.05.2017

Ворота пишет:

С присваиванием ещё вот так прикольно

// #1
*s++ += 10;

// #2
*s++ = *s++ + 10;

:-)

ну это уже не смешно :) - если программист не заметил двойного инкремента - не префиксные операторы виноваты

SLKH
Offline
Зарегистрирован: 17.08.2015

ua6em пишет:

Sonologist пишет:

Гриша пишет:

 я давно не видел записи {y = i + 1; i=y;}  :)))))))

Грешен я, Гриш! Я тоже единичку плюсую и вычитаю ++ или -- :) Это первый шаг к программистскому шику? :) 

а как вы вычитаете и плюсуте --x, --y или x++,y++ ??? ;-)))


byte x, y, z;
void loop() {
  y = 24;
  x = 5;
  z = y * --x;
  Serial.print("z=y * --x  ");
  Serial.println(z);
  y = 24;
  x = 5;
  z = y * x--;
  Serial.print("z=y * x--  ");
  Serial.println(z);
  Serial.println();
  delay(2000);
}
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Чечако пишет:

...я до сих пор предпочту написать if(flag==true), нежели if(flag), мне так более читаемо.

Как насчет читаемости - не скажу, но это разные выражения. Подставьте, например, flag==2.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

andriano пишет:

это разные выражения. 

Полагаю, что коллега имел в виду, что flag имеет тип bool. Тогда всё не так плохо.

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

andriano пишет:

это разные выражения. 

Полагаю, что коллега имел в виду, что flag имеет тип bool. Тогда всё не так плохо.

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

а есть ли смысл bool применять, память не экономим, разный код после компиляции???

svm
Offline
Зарегистрирован: 06.11.2016

ua6em пишет:

а есть ли смысл bool применять, память не экономим, разный код после компиляции???

В него наверное наверное тяжелее какую нибудь хрень впихнуть.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:

а есть ли смысл bool применять???

Конечно, нет. Единственная полезная типизация - это когда переменные, имена которых начинаются с i,j,k,l,m,и n - целые, а все остальные - вещественные, а единственная полезная структура данных - массив (пруф).

negavoid
Offline
Зарегистрирован: 09.07.2016

Там ещё написано, что нужно использовать самомодифицирующийся код, что в условиях гарвардской архитектуры несколько затруднено :)

PS вчера нашёл вас в паблике )) бывал в Ярославле, очень красивый город.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

ua6em пишет:

а есть ли смысл bool применять???

Конечно, нет. Единственная полезная типизация - это когда переменные, имена которых начинаются с i,j,k,l,m,и n - целые, а все остальные - вещественные, а единственная полезная структура данных - массив (пруф).

нет, он уже не прав, настоящих программистов теперь вычисляют по потреблению

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

ua6em пишет:

нет, он уже не прав

Мерзкие инсинуации! На уровне гнусной клеветы. что типа "фортран устарел"!

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

negavoid пишет:
несколько затруднено
А кто обещал, что будет легко? Но, «настоящий  программист может написать фортрановскую программу на любом языке» и в любой архитектуре.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ЕвгенийП пишет:

ua6em пишет:

нет, он уже не прав

Мерзкие инсинуации! На уровне гнусной клеветы. что типа "фортран устарел"!

ну не знаю, я о нём только слышал, слово так сказать знакомое )))

Logik
Offline
Зарегистрирован: 05.08.2014

svm пишет:

ua6em пишет:

а есть ли смысл bool применять, память не экономим, разный код после компиляции???

В него наверное наверное тяжелее какую нибудь хрень впихнуть.

Без проблем и впихивается и выпихивается. Применяется часто, чтоб себе и людям показать что там флажок но лень его делать в битовом поле. Сложные логические выражения с ним всеж попроще доходят.

Чечако
Offline
Зарегистрирован: 15.06.2018

andriano пишет:

Как насчет читаемости - не скажу, но это разные выражения. Подставьте, например, flag==2.

Спасибо, кэп. Я имел ввиду именно пример упрощенной записи с булевыми переменными. 

Чечако
Offline
Зарегистрирован: 15.06.2018

ua6em пишет:

а есть ли смысл bool применять, память не экономим, разный код после компиляции???

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

yuhenotix@2p-ma...
Offline
Зарегистрирован: 09.06.2019

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

Вот в спектрумах вопрос решили сразу, нажал одну кнопк и сразу  RANDOMIZE\PRINT\POKE\OUT\LOAD вставился.

Писать было одно удовольствие, а бейсик 128 поэтому  и не пошел, там все надо было набирать  по букве.

Синтаксические  языки себя изжили  на 100%.

Будущее за алгоритмо-структурно-графическими средами с элементами  синтаксиса в самих блоках-заготовках в случае необходимости . (это уже реализовано для промконтроллеров давно и  работает прекрасно, мне понравилось когда  впервые   20 лет назад мне  дали  все это и  сказали на, делай  линию сварки:)  и я просто нарисовал и зблоков,восторг был большой, а рядом  сидели СИшники и  годами что-то колдовали над какой-то советской  системой управления  складом деталей, которую давно  можно было перевести на иностранные пром контроллеры с их средой разработки)

И бич 1000 и одного синтаксиса просто не  существует и обеспечивает  максималльно быстрый вход в разработку и быстрый резулльтат. Я недавно столкнулся с  питоном... Плевался  долго, это просто блевотина, поставил  не там пробел, все, - строка не рабочая, такого дебилизма я  в жизни не встречал, это не мог придумать человек с нормальной психикой.

negavoid
Offline
Зарегистрирован: 09.07.2016

Ловите КИПовца :)))

А структурные блоки, по-вашему, от Высшей силы появляются? Или всё же, их сначала создают для вас соседи-сишники или пайтонисты? ))

yuhenotix@2p-ma...
Offline
Зарегистрирован: 09.06.2019

Ну так и  бери песок, производи микросхемы, напечатай  на принтере корпус(кстати  его тоже надо будет сначало собрать из глины алок  и медной проволоки), выплавь  детальки... нафиг ты  готовый  комп  вмагазине взял ? Эт оне правильно, надо все самому сделать, вникнуть в суть так сказать  каждой конденсаторной пластинки и полупроводника, ведь надо же потом будет ремонтировать, дорабатывать, а как не зная сути все это сделать ?

Глядишь к пенсии  соберешь, не успееш так внуки доделают.

b707
Offline
Зарегистрирован: 26.05.2017

quote=yuhenotix@2p-mail.com - это сайт, где большинству участников нравится именно программировать, а не собирать мышкой ромбики и квадратики для трехлетних детей. Если вам наравятся графические среды - вам тут делать нечего, для поклонников рисования есть другие форумы.