Апирация запятая

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

Правильно ли я понимаю, что данная канструкцыя имеет право на жизнь? 

	uint32_t now = millis();
	while (Read(), !isReady()) {
		if (millis() - now > TIMEOUT_I2C_MS) return false;
		delay(2);
	} 
	return true;

Read() ничего не отдает, только читает буфер, а isReady читает из этого буфера бит и возвращает true/false.   Если устройство не готово в течение TIMEOUT_I2C_MS вся эта функция отдает false.  Я пропробовал, вроде работает, но мало ли чо.  

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

чота while жирным не выделился :(

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

Правильно понимаете.

Более интересен вопрос, как эту операцию использовать в тех местах, где запятая имеет особый смысл, например, в списке параметров, при вызове функции :)

А почему, кстати, "запятая", а не "запитая"?

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

Спасибо

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

Более интересен вопрос, как эту операцию использовать в тех местах, где запятая имеет особый смысл, например, в списке параметров, при вызове функции :)

в скобках ставить kaka(a, (b=3, b+1), z); 

передасца a, 4, z

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

Компилятор пропустил - значить имеет право на жизнь. Другой вопрос - делает ли она то, что нужно ;) Похоже что да. Но тайный смысл делея и миллиса рядом не понятен, чтото типа

f o r ( i=TIMEOUT_I2C_MS/2;i;i--){
Read() ; 
i f ( isReady())
   r e t u r n    t r u e;
delay(2);
}
r e t u r n     f a l s e;

 

вроде тоже, но проще во всех смыслах.

ПС. Код вставляется через хер, боролся пробелами

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

да, так тоже можно, спасиба

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

DetSimen пишет:

в скобках ставить kaka(a, (b=3, b+1), z); 

передасца a, 4, z

Не, ну это простейший случай. А вот так? :)

typedef void (* Kaka)(const int a, const int b);
Kaka kaka[3];

.............

void setup() { 
	int n = 0;
	kaka[n++](n = 3, (n++, n--));
} 

void loop() {}

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Одно непонятно, зачем так писать? Риторический конечно.

 

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

— И вся эта операция 
— Ы!
— Почему Ы?
— Чтобы никто не догадался.

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

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

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

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

Не, ну это простейший случай. А вот так? :)

typedef void (* Kaka)(const int a, const int b);
Kaka kaka[3];

.............

void setup() { 
	int n = 0;
	kaka[n++](n = 3, (n++, n--));
} 

void loop() {}

 

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

Т.е. фрагмент кода на Си является переводом некоторой фразы на русском языке.

Вот мне интересно, как должна звучать исходная русская фраза для строки №8?

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

andriano пишет:

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

На каком-то уровне это проходит.

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

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

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

DetSimen пишет:

в скобках ставить kaka(a, (b=3, b+1), z); 

передасца a, 4, z

Не, ну это простейший случай. А вот так? :)

typedef void (* Kaka)(const int a, const int b);
Kaka kaka[3];

.............

void setup() { 
	int n = 0;
	kaka[n++](n = 3, (n++, n--));
} 

void loop() {}

 


настолько далеко моё скудоумие не прастираеца.
Переделал по мотивам Logic.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

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

Вы когда-нибудь жили долго за границей?

ПОлагаю вопрос риторическим. Я невыездной.

Цитата:

Вот как-то так и с ЯВУ. В какой-то момент что-то щёлкает и ты уже думаешь на нём. А когда на нём думаешь, то уже не нуждаешься в переводе с русского.

Вы пытаетесь увести разговор в сторону, а я все еще хочу получить ответ на вопрос в последнем предложении поста №10.

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

andriano пишет:

Вы пытаетесь увести разговор в сторону, а я все еще хочу получить ответ на вопрос в последнем предложении поста №10.

Не пытаюсь, просто тот воспринял вопрос как риторический. Но, если он не таковой, то извольте

andriano пишет:

как должна звучать исходная русская фраза для строки №8?

Никак, т.к. конструкция изначально задумывалась как неопределённая и таковой является. Так что, если русская фраза и должна как-то звучать, то примерно так: «Какой мудак это навертел и что он при этом имел в виду?».

При создании же строчки задача стояла так: «Нужно придумать неприемлемый, неоднозначный пример». Хотя, решение получилось неудачным – излишне навороченным. Достаточно было

 int n = 0;
 kaka (n = 3, (n++, 5));

 

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

ЕвгенийП пишет:
Хотя, решение получилось неудачным – излишне навороченным. Достаточно было

 int n = 0;
 kaka (n = 3, (n++, 5));

Женя! Исходя из последовательности вычислений слева направо получается

kaka (3,5);

Помоги увидеть иное прочтение... торможу.

-------------------------------

через 5 мин: если ты имеешь ввиду то, что запятая после "n = 3" может быть прочитана как знак операции, то это не так, по структуре синтаксического анализатора, который использован в компиляторе С (это который "бизон"). Грамматика использована в праворекурсивной форме и использована контекстная зависимость. То есть, раз нету функции-полиморфа от одного аргумента, то на лексемы мы разделим "запятая-опретор" и "запятая-разделитель" на уровне синтаксического анализа.

Старый спор проектировщиков компиляторов об избежании контекстной зависимости. Невозможно ее полностью избежать. Твой пример решается, но можно придумать сложнее, или задать kaka() - полиморфом. И мы придем к парадоксу.

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

Это запятая «слева направо», а список параметров функции - последовательность вычислений неопределена (см. ISO/IEC 14882:2017, п. 8.2.5 (стр. 110): «The initialization of a parameter, including every associated value computation and side effect, is indeterminately sequenced with respect to that of any other parameter»)

Компилятор имеет право сгенерировать вычисление аргументов в любой последовательности. Бывает, что он генерирует по-разному в разных контекстах. Наконец, современные компиляторы при генерации кода для многоядерных систем иногда не стесняются вычислять аргументы параллельно. Так что с побочными эффектами у аргументов надо быть осторожнее.

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

А я вот просто неоднозначность не люблю.  Потому и спросил, чтоб узнать, работает ли это так как я думаю.  

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

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

 

Компилятор имеет право сгенерировать вычисление аргументов в любой последовательности. Бывает, что он генерирует по-разному в разных контекстах. Наконец, современные компиляторы при генерации кода для многоядерных систем иногда не стесняются вычислять аргументы параллельно. Так что с побочными эффектами у аргументов надо быть осторожнее.

На пенсфонд РФ похоже.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

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

andriano пишет:

как должна звучать исходная русская фраза для строки №8?

«Какой мудак это навертел и что он при этом имел в виду?».

Ну я, честно говоря, не решился сформулировать свой вопрос в таком виде.)

А что касается перевода, мне кажется, ближе: "Варкалось. Хливкие шорьки..."

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

Напрасно, я достаточно адекватен для таких формулировок :)))