sizeof(bool)

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Навеяно https://forum.arduino.cc/index.php?topic=156141.0 (осадочек остался, как до меня дошёл слушок что bool=byte, если речь об адресации).

Этюды читать не доставляет (там срач с Архатом и выяснение перспективности/ущербности использования ООП), а первую тему по памяти найти не удалось. Поэтому хочу спросить: как вы решаете данную проблему?

Лично мне приходит в голову только что-то типа процедуры, которая получает интересующий адрес (номер бита, как если взять и слепить все биты в одно большущее двоичное число, а потом взять по 8 - и в байты, в массив), делит на 8, берёт из массива тот что с номером получившимся при делении, и потом выясняет по маске что за бит в конкретно этом байте, руководствуясь остатком деления. Типа

byte shit[3]={0b00010101,0b11001010,0b01011101}; // total 24
//                                  ^- this son of the bitch
// some code here ...
byte n=17;          // wtf 17? its fucking sample
byte tmp=(byte)n/8; // =2
byte tmp_lower=n%8; // = 17-(2*8)=17-16=1
bool gold_in_shit=bitRead(shit[tmp],tmp_lower); //= SOB value, =1

Возможно, +1 к адресу, ибо чёта непонятка, какой там из них 17й, так то он 16й, счёт с нуля же.

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

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

n/8 вместо n>>3 и n%8 вместо n&7, это форма троллинга? Или тип мышления?

Скорее всего компилятор это исправит сам... но все равно как-то жутко видеть операцию mod в 8ми битном контроллере на 16 МГц.

sadman41
Offline
Зарегистрирован: 19.10.2016

Уточню: проблему с чем? В байте/инте/лонге бит проверить или чего?

В макросах на размер переменной нет ограничений. Какую сунешь - такая и в проверку пойдёт.

#define bitRead(value, bit) (((value) >> (bit)) & 0x01)
#define bitSet(value, bit) ((value) |= (1UL << (bit)))

 

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

wdrakula, никакого троллинга. Я этого правда не знаю.

Почему в маске & семёрка? Как она связана с 8?

Если чо то обе мои преподавательницы по информатике были тян, может это влияет.

sadman41, моя формулировка проблемы такова: я люблю использовать массивы из bool, удобно в цикле включать светодиоды. Но если это расходует памяти в 8 раз больше чем я предполагаю, то надо это как-то решать.

sadman41
Offline
Зарегистрирован: 19.10.2016

Voodoo Doll пишет:

sadman41, моя формулировка проблемы такова: я люблю использовать массивы из bool, удобно в цикле включать светодиоды. Но если это расходует памяти в 8 раз больше чем я предполагаю, то надо это как-то решать.

Это вопрос щекотливый - если пытаться экономить RAM, то придётся писать врапперы, теряя в ROM и получая потерю в производительности (mod - не дешёвая операция).

Но, положим, если светодиодов 100 штучек, то какбэ и заморачиваться нет резона, по-моему - пользуйся байтом, как битом (bool). 

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Voodoo Doll пишет:

Почему в маске & семёрка? Как она связана с 8?

вот это точно троллинг.

7=0b111, три последних бита. Это не информатика, это 4 или 5 класс школы для даунов.

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

Voodoo Doll пишет:
я люблю использовать массивы из bool, удобно в цикле включать светодиоды. Но если это расходует памяти в 8 раз больше чем я предполагаю, то надо это как-то решать.
Полюбите битовые поля.

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

wdrakula пишет:

Скорее всего компилятор это исправит сам... 

100%. Проверено.

sadman41
Offline
Зарегистрирован: 19.10.2016

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

Полюбите битовые поля.

По ним же не побегаешь с индексом, насколько я понимаю.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Voodoo Doll пишет:

Почему в маске & семёрка? Как она связана с 8?

Встречные наводящие вопросы: каков максимальный остаток от деления значения одного байта (0-255) на 8? И сколько этот остаток занимает бит в байте? И какой маске соответствует это кол-во бит?

Ответив на все эти вопросы - процитированные вопросы отпадают сами собой ;)

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

DIYMan пишет:

каков максимальный остаток от деления значения одного байта (0-255) на 8?

Я бы вместо "одного байта (0-255)" сказл бы "чего бы то ни было".

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

sadman41 пишет:

По ним же не побегаешь с индексом, насколько я понимаю.

При определённом желании вполне можно побегать.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

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

DIYMan пишет:

каков максимальный остаток от деления значения одного байта (0-255) на 8?

Я бы вместо "одного байта (0-255)" сказл бы "чего бы то ни было".

Да, спс за поправку ;)

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

DIYMan пишет:
каков максимальный остаток от деления значения одного байта (0-255) на 8?

Идём в калькулятор, получаем 255/8 = 31.25 = почти 32, то есть 0b1111 есть точно (31=1+2+4+8). 32 нету. Вывод: остаток деления, если он есть, больше половины ширины делимого?

DIYMan пишет:
сколько этот остаток занимает бит в байте?

Всё сверх той половины?

https://www.youtube.com/watch?v=PvZPfUktzoM

wdrakula, знали бы вы как в моём Усть-перезассанске преподавали естественные науки в 90х-00х годах - захотели бы растворить преподавателей в какой-нибудь кислоте. Слава яйцам, аллаху и будде что я вообще сейчас отличаю XML от HTML. Скобочки же у тегов одинаковые. Давайте для детей, даунов или за кого вы там меня держите.

Ибо раз вы неспособны объяснить ребёнку, чем именно занимаетесь, то грош вашим знаниям цена (с) по-моему Капица.

DISCLAIMER: поясняю для тех кто в танке: я знаю о битовых операциях в C следующее:

|| или, && и, ! не

| от-илить, тобишь 1101|0011=1111

& чтобы ить числа, тоесть 1101&1001=1001

^ вроде чтобы хорить, но хз. Не использую.

Всмысле, вышеперечисленные операторы я считаю арифметическими, как + -

Далее.

Я НЕ УМЕЮ ПИСАТЬ НА C.

Я умею писать на паскале. А ещё он отличается синтаксисом, вместо begin end; фигурные скобачьки. Всё.

ЕвгенийП пишет:
При определённом желании вполне можно побегать.

Как? Пока что идей лучше чем в первом посте, с правками wdrakula, у меня нет.

sadman41
Offline
Зарегистрирован: 19.10.2016

Voodoo Doll пишет:

DIYMan пишет:
каков максимальный остаток от деления значения одного байта (0-255) на 8?

Идём в калькулятор, получаем 255/8 = 31.25 = почти 32, то есть 0b1111 есть точно (31=1+2+4+8). 32 нету. Вывод: остаток деления, если он есть, больше половины ширины делимого?

Вот тебе, рыбёнок, экзампл.  

void setup() {
  uint8_t number, mod, bitwise;

  number = 123;
  mod = number % 8;
  bitwise = number & B00000111;

  Serial.begin(115200);
  //while(!Serial);
  Serial.print("mod: "); Serial.print(mod); Serial.print(", bitwise: ");  Serial.println(bitwise);
}

 

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Короче, я просто запомню: x mod y (aka x % y) = x & (base2(y)-1).

PFM.

sadman41
Offline
Зарегистрирован: 19.10.2016

Ты лучше запомни, что единичной непрерывной битовой маской сбрасываешь всё, что равно и больше 2^n, где n - позиция первого нуля в маске. Т.е. оставляешь хвостик, который и есть остаток. А вот с твоей математикой в беду попадёшь, имхо. 

Например

  number = 123;
  mod = number % 5;
  bitwise = number & B00000100;

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Voodoo Doll пишет:

DIYMan пишет:
каков максимальный остаток от деления значения одного байта (0-255) на 8?

Идём в калькулятор, получаем 255/8 = 31.25 = почти 32, то есть 0b1111 есть точно (31=1+2+4+8). 32 нету. Вывод: остаток деления, если он есть, больше половины ширины делимого?

Идем в калькулятор, набираем там 255, затем - жмём кнопку Mod, затем - вводим 8, затем - жмём "равно". Эта операция значит - остаток от деления, т.е. 255 Mod 8, или, в языке С - 255%8. Какой результат?

Ответ: максимальный остаток от деления - всегда на единицу меньше делителя, в нашем случае (делитель 8) - это будет 7. Число 7 - это установленные три младшие бита в байте, поэтому, чтобы получить остаток от деления на 8 - достаточно сделать AND с маской с, в нашем случае: 255 & 7 = 7, или, если проверять на калькуляторе - 255, кнопка And, 7, равно.

Понятно, почему маска 7 при делителе 8?

З.Ы. На всякий оставлю это здесь, а то, пмсм, налицо непонимание, что такое остаток от деления: https://ru.wikipedia.org/wiki/%D0%94%D0%B5%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D1%81_%D0%BE%D1%81%D1%82%D0%B0%D1%82%D0%BA%D0%BE%D0%BC

Оттуда:

Цитата:

Неполное частное и неотрицательный остаток от деления на степень двойки 2^{n} — это битовый сдвиг {\displaystyle a\gg n} (для отрицательных чисел — арифметический) и {\displaystyle a\mathop {\&} (2^{n}-1)}.

Чему полностью соответствует предложенное wdrakula:

Цитата:

n/8 вместо n>>3 и n%8 вместо n&7

Ключевое для понимания - степень двойки ;)

sadman41
Offline
Зарегистрирован: 19.10.2016

С отсатками - ок. Как дёшево и изящно бегать по битовым полям?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Voodoo Doll пишет:

Короче, я просто запомню: x mod y (aka x % y) = x & (base2(y)-1).

PFM.

Как правильно заметил sadman41 - это утверждение справедливо только для y = 2^n, т.е. когда делитель является степенью двойки.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

sadman41 пишет:

С отсатками - ок. Как дёшево и изящно бегать по битовым полям?

Расшифруй "по битовым полям", плз. Имеется в виду

struct bitfield
{
  byte b1: 1;
  byte b2: 1;
  ...
};

??? Или просто битовое поле в его определении?

sadman41
Offline
Зарегистрирован: 19.10.2016

Я не могу гарантировать, что правильно понял идею из #7, но мне кажется это "структурные" однобитные переменные. Которые потом компилятор, скорее всего, через bitwise operations превращает в обычные байты по мере использования.

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

Voodoo Doll пишет:

поясняю для тех кто в танке: я знаю о битовых операциях в C следующее:

|| или, && и, ! не

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

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

sadman41 пишет:

Я не могу гарантировать, что правильно понял идею из #7, но мне кажется это "структурные" однобитные переменные. Которые потом компилятор, скорее всего, через bitwise operations превращает в обычные байты по мере использования.

Ну там тоже не всё просто: в структуре может быть и член - не битовое поле. И ширина битового поля-члена может быть не один бит. И адрес битового поля получить компилятор не даст. Пмсм, в общем случае - лучше отдаться на откуп компилятору, и погасить в себе желание бегать по битовым полям структуры каким-либо способом: завтра туда добавится новое поле, и аллес. Я так вижу, во всяком случае.

sadman41
Offline
Зарегистрирован: 19.10.2016

А я всё ещё верю в то, что ЕвгенийП взмахнёт левым рукавом и оттуда посыплются волшебные алгоритмы замен байтмассивов на битмассивы. Потом взмахнёт правым рукавом и байт влезет шишнадцать бит.

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

Voodoo Doll пишет:

Как? Пока что идей лучше чем в первом посте, с правками wdrakula, у меня нет.

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

#ifndef	BOOLARRAY_H
#define BOOLARRAY_H

template <byte nSize> struct CBoolArray {
	struct CunningBool {
		byte & bt, mask;
		CunningBool(byte & _bt, byte _mask) : bt(_bt), mask(_mask) {}
		operator bool(void) { return static_cast<bool> (bt & mask); }
		bool operator = (const bool b) { return (bt = b ? bt | mask : bt & ~mask); }
	};
	byte anArray[(nSize + 7) / 8];
	CBoolArray(void) { memset(anArray, 0, sizeof(anArray)); }
	CunningBool operator [] (int n) { return CunningBool (anArray[n / 8], 1 << (n % 8)); }
};

#endif	//	BOOLARRAY_H

Как видите, сутевых здесь всего 11 строк.

Теперь спокойно объявляете массив в таком виде

CBoolArray<количество> booleanArray;

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

Вот пример использования:

#include "Printing.h"
#include "BoolArray.h"

static const int8_t totalBools = 15;

static CBoolArray<totalBools> booleanArray;

//
// Печать массива.
// Обратите внимание, что для печати "TRUE" и "FALSE" мы используем 
//	элемент массива в качестве bool в операторе "?"
//
void printArray(const char * title) {
	Serial << "*** " << title << "\r\n";
	for (int8_t i = 0; i < totalBools; i++) {
		Serial << "booleanArray[" << i << "]=" 
			<< (booleanArray[i] ? "TRUE" : "FALSE") << "\r\n";
	}
	Serial << "-------------------------------\r\n";
}

void setup(void) {
	Serial.begin(57600);
	// 
	// Убедимся, что размер правильный
	Serial << "sizeof(booleanArray) = " << sizeof(booleanArray) << "\r\n";
	//
	//	Печатаем массив. Там сначала все false
	printArray("All elements are FALSE");
	//
	//	Делаем все true и опять печатаем
	for (int8_t i = 0; i < totalBools; booleanArray[i] = true, ++i);
	printArray("All elements are TRUE");
	//
	//	Делаем чётные элементы false, а нечётные - true
	for (int8_t i = 0; i < totalBools; booleanArray[i] = (i % 2), ++i);
	printArray("Even elements are FALSE while odd elements are TRUE");
}

void loop(void) {}

Вот результат работы, как видите, всё правильно и размер массива - 2 байта, т.е. для 15 булов - то, что доктор прописал.

sizeof(booleanArray) = 2
*** All elements are FALSE
booleanArray[0]=FALSE
booleanArray[1]=FALSE
booleanArray[2]=FALSE
booleanArray[3]=FALSE
booleanArray[4]=FALSE
booleanArray[5]=FALSE
booleanArray[6]=FALSE
booleanArray[7]=FALSE
booleanArray[8]=FALSE
booleanArray[9]=FALSE
booleanArray[10]=FALSE
booleanArray[11]=FALSE
booleanArray[12]=FALSE
booleanArray[13]=FALSE
booleanArray[14]=FALSE
-------------------------------
*** All elements are TRUE
booleanArray[0]=TRUE
booleanArray[1]=TRUE
booleanArray[2]=TRUE
booleanArray[3]=TRUE
booleanArray[4]=TRUE
booleanArray[5]=TRUE
booleanArray[6]=TRUE
booleanArray[7]=TRUE
booleanArray[8]=TRUE
booleanArray[9]=TRUE
booleanArray[10]=TRUE
booleanArray[11]=TRUE
booleanArray[12]=TRUE
booleanArray[13]=TRUE
booleanArray[14]=TRUE
-------------------------------
*** Even elements are FALSE while odd elements are TRUE
booleanArray[0]=FALSE
booleanArray[1]=TRUE
booleanArray[2]=FALSE
booleanArray[3]=TRUE
booleanArray[4]=FALSE
booleanArray[5]=TRUE
booleanArray[6]=FALSE
booleanArray[7]=TRUE
booleanArray[8]=FALSE
booleanArray[9]=TRUE
booleanArray[10]=FALSE
booleanArray[11]=TRUE
booleanArray[12]=FALSE
booleanArray[13]=TRUE
booleanArray[14]=FALSE
-------------------------------

UPDATE:
На самом деле, с memset я погорячился. Для маленьких массивов (а тут будут только такие), обычный цикл работает быстрее. Кто будет использовать, лучше замените.

UPDATE2:
Заметил, что забыл сделать возможность присваивать элементы массива друг другу. Может, и не нужно, но, для полноты операций, лучше сделать. Вот версия класса с возможностью такого присваивания:

#ifndef	BOOLARRAY_H
#define BOOLARRAY_H

template <byte nSize> struct CBoolArray {
	struct CunningBool {
		byte & bt, mask;
		CunningBool(byte & _bt, byte _mask) : bt(_bt), mask(_mask) {}
		operator bool(void) { return static_cast<bool> (bt & mask); }
		bool operator = (const bool b) { return (bt = b ? bt | mask : bt & ~mask); }
		bool operator = (CunningBool & other) { return static_cast<bool>(*this = static_cast<bool>(other)); }
	};
	byte anArray[(nSize + 7) / 8];
	CBoolArray(void) { memset(anArray, 0, sizeof(anArray)); }
	CunningBool operator [] (int n) { return CunningBool (anArray[n / 8], 1 << (n % 8)); }
};

#endif	//	BOOLARRAY_H

 

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

DIYMan пишет:
Понятно, почему маска 7 при делителе 8?

Теперь понятно.

DIYMan пишет:
справедливо только для y = 2^n

Ну дык у меня других ситуаций и не будет, если я буду заводить всегда n байтов, я ж соображаю что нужно целое число байтов, неважно 5 битов там в последнем используется или все 8.

ЕвгенийП, спасибо. Возможно, я даже найду и пойму самостоятельно - а почему ноль в memset, или что-то ещё. То что 1<<число это бит 1 на нужном месте, которое задаёт "число", я знаю на опыте чтения CyberLib. Возможно, даже потом буду писать нечто подобное. О том, что в C (или C++, как его там) можно переназначать дефайнами любое нечто в любое другое нечто, я впринципе знаю, но применять это знание, очевидно, мне не позволяет некая фундаментальная тупость.

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

Voodoo Doll пишет:
а почему ноль в memset
Что там false изначально были. Кстати, я там "update" на тему memset приписал, смотрите.

leks
Offline
Зарегистрирован: 22.10.2017

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

Voodoo Doll пишет:

поясняю для тех кто в танке: я знаю о битовых операциях в C следующее:

|| или, && и, ! не

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

Не знаю, может совсем мимо кассы.., но год назад я смело писал вместо if (a==1&&b==1)...  if(a==1&b==1)... и всё работало как задумано было. В отличии от "=" и "==". Но если разницу между равно и тождественно равно нам в школе объясняли, то разницу между && и & (пардон за тавтологию) понять сходу непросто.

 А сама тема актуальна, вчера подправил свой скетч для куба через "битрид" и "битврайт" (спасибо за прошлогоднюю подсказку "деду Семёну") и добыл (216-27) нужных в другом массиве байт.  

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

нальёшь при случае. 

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

leks пишет:
разницу между && и & (пардон за тавтологию) понять сходу непросто.
Но, сейчас-то понимаете?

leks
Offline
Зарегистрирован: 22.10.2017

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

leks пишет:
разницу между && и & (пардон за тавтологию) понять сходу непросто.
Но, сейчас-то понимаете?

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

sadman41
Offline
Зарегистрирован: 19.10.2016

Концептуально, как я понимаю, разница такова: в сложном условии при использовании '&&' вычисление условия остановится на первом же false-результате, а при '&' будет доведено до конца, а только потом проанализирован результат.

leks
Offline
Зарегистрирован: 22.10.2017

sadman41 пишет:

Концептуально, как я понимаю, разница такова: в сложном условии при использовании '&&' вычисление условия остановится на первом же false-результате, а при '&' будет доведено до конца, а только потом проанализирован результат.

Ну вот, а меня упрекнули (не помню на каком ресурсе), что я использую & неправильно и аргумент про работоспособность не в счёт. 

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

результатом && является булево значение 0/не 0, а результатом & - обычное арифметическое 

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

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

Вот так всё замечательно работает

struct A  {
	int a;
};

void setup(void) {
	Serial.begin(57600);
	struct A first[] = {{1}, {11}};
	Serial.print("first[0].a=");
	Serial.print(first[0].a); 
	Serial.print("; first[1].a=");
	Serial.println(first[1].a);
}

void loop(void) {}

А вот так - хрентам

struct A  {
	A(void) {}
	int a;
};

void setup(void) {
	Serial.begin(57600);
	struct A first[] = {{1}, {11}};
	Serial.print("first[0].a=");
	Serial.print(first[0].a); 
	Serial.print("; first[1].a=");
	Serial.println(first[1].a);
}

void loop(void) {}
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

leks пишет:

Ну вот, а меня упрекнули (не помню на каком ресурсе), что я использую & неправильно 

Правильно упрекнули

leks пишет:

работоспособность не в счёт. 

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

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

Voodoo Doll пишет:

Этюды читать не доставляет (там срач с Архатом и выяснение перспективности/ущербности использования ООП),

Мы с сыном тоже эту тему трём и, он меня убедил в правильности ООП )))

sadman41
Offline
Зарегистрирован: 19.10.2016

DetSimen пишет:

результатом && является булево значение 0/не 0, а результатом & - обычное арифметическое 

Так-то да, но в приведённом примере ( if(a==1&b==1) ) они совпадают и действительно трудно уловить разницу.

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

Ворота пишет:
Мужики, а может кто-то объяснить,
Не знать Вы этого не можете, а потому ... это задачка для новичков или просто пятничный троллинг?

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

Voodoo Doll пишет:

Этюды читать не доставляет (там срач с Архатом 

Почистить? Или один хрен читать не будете?

sadman41
Offline
Зарегистрирован: 19.10.2016

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

Voodoo Doll пишет:

Этюды читать не доставляет (там срач с Архатом 

Почистить? 

Чтобы потом поциэнт сказал, что Океания никогда не воевала с Остазией?

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

sadman41 пишет:

Чтобы потом поциэнт сказал ...

Да, я как к поциенту отношусь как Губерман к власти: «Я не люблю любую власть, мы с каждой не в ладу, но я, покуда есть что класть, на каждую кладу» (И. Губерман). Он ведь по-любому найдёт, что сбрехать, что бы мы ни делали.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

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

Ворота пишет:
Мужики, а может кто-то объяснить,
Не знать Вы этого не можете, а потому ... это задачка для новичков или просто пятничный троллинг?

Ворота! Я тут согласен с Евгением. Ты - знаешь, а те, кто не знает, не знают также - нахера им это знать!

Какого лешего тебя понесло в анализ (модифицированного веществами) сознания создателей стандарта С++?

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

Дык, Влад, пятница ж!

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

Ну, видать, неудачно пошутил - звиняйте :-)

leks
Offline
Зарегистрирован: 22.10.2017

sadman41 пишет:

Концептуально, как я понимаю, разница такова: в сложном условии при использовании '&&' вычисление условия остановится на первом же false-результате, а при '&' будет доведено до конца, а только потом проанализирован результат.

Это очень доходчиво и понятно.

leks
Offline
Зарегистрирован: 22.10.2017

wdrakula пишет:

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

Ворота пишет:
Мужики, а может кто-то объяснить,
Не знать Вы этого не можете, а потому ... это задачка для новичков или просто пятничный троллинг?

Ворота! Я тут согласен с Евгением. Ты - знаешь, а те, кто не знает, не знают также - нахера им это знать!

Какого лешего тебя понесло в анализ (модифицированного веществами) сознания создателей стандарта С++?

Меньше знаешь - крепче спишь (проще - дубоватей решения:)

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

leks пишет:

Это очень доходчиво и понятно.

Только ещё и #34 поймите, там более важное свойство этих операций обсуждается

leks
Offline
Зарегистрирован: 22.10.2017

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

leks пишет:

Это очень доходчиво и понятно.

Только ещё и #34 поймите, там более важное свойство этих операций обсуждается

https://www.it-rem.ru/logicheskoe-i-pobitovoe-i.html

Вот здесь мельком прочитал (надо убегать на выпускной к дочке), вроде ясно всё - итог будет один, вопрос траты времени на проверку всех условий. Ведь так? Если одно утверждение в цепочке ложь, то и всё будет ложь при одинарном или двойном значке. Просто по привычке одинарный значок считал логическим "и". 

 

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

leks пишет:
вроде ясно всё - итог будет один
Да, в том-то и дело, что разный итог. Ничерта ведь не поняли :)