кому c quiz ?

Все, что вы хотели знать о программизме, но боялись спросить.
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

Музчины!
Кто ещё хочет на меня ругаться, ещё хочет коммисарского тела, знайте - я пошёл домой. Могу посмотреть только завтра. У нас здесь в России суббота сеодня.
Пока.
ilid
Завсегдатай
Сообщения: 255
Зарегистрирован: 19 мар 2003, 13:31

Re: кому c quiz ?

Сообщение ilid »

drain bamage писал(а):Значит так. Вопрос я очевидно сформулировал плохо, перефразирую.

Является ли заключенный в круглые скобки statement block

Код: Выделить всё

({....})


разрешенной стандартом r-value конструкцией ?
А какая польза тебе от этого? Вопрос дилетантский, но всё же, ведь должен быть смысл.
Аватара пользователя
Akrav
Графоман
Сообщения: 12527
Зарегистрирован: 17 июн 2003, 13:30

Сообщение Akrav »

Если кому надо могу прислать Кернигана по мылу. Только укажите на каком языке (русский или английский or both).
Последний раз редактировалось Akrav 04 июл 2003, 22:43, всего редактировалось 1 раз.
Аватара пользователя
Akrav
Графоман
Сообщения: 12527
Зарегистрирован: 17 июн 2003, 13:30

Сообщение Akrav »

ИМХО ответ на главный вопрос очевиден. Стандарт такого не допускает.
Я не помню, чтобы это было где-то упомянуто и не полагался бы только на память, искать лень. Однако сообщение об ошибке, генерируемое наиболее популярными компиляторами может означать только два варианта. Менее вероятный, что все эти компиляторы имеют один баг и более вероятное, что блок может быть r-value не допускается стандартом.
Самое вольное место по теме это операция запятая.
Аватара пользователя
Akrav
Графоман
Сообщения: 12527
Зарегистрирован: 17 июн 2003, 13:30

Сообщение Akrav »

3.1 Statements and Blocks
An expression such as x = 0 or i++ or printf(...) becomes a statement when it is followed by a semicolon, as in

x = 0;
i++;
printf(...);
In C, the semicolon is a statement terminator, rather than a separator as it is in languages like Pascal.
Braces { and } are used to group declarations and statements together into a compound statement, or block, so that they are syntactically equivalent to a single statement. The braces that surround the statements of a function are one obvious example; braces around multiple statements after an if, else, while, or for are another. (Variables can be declared inside any block; we will talk about this in Chapter 4.) There is no semicolon after the right brace that ends a block.


Нет такого понятия statement-block. Или -- или. Обратите внимание, что статемент всегда образуется при помощи точки с запятой.
Аватара пользователя
ajkj3em
Маньяк
Сообщения: 2063
Зарегистрирован: 12 ноя 2006, 06:53

Сообщение ajkj3em »

Akrav писал(а):ИМХО ответ на главный вопрос очевиден. Стандарт такого не допускает.
отнюдь не очевиден, особенно с учетом того, что стандартов как минимум два (c89 и c9x). поборов естественную лень и набрав "gcc language extensions" в гугле, нашел я собсно то, что и ожидалось -

http://www-es.fernuni-hagen.de/cgi-bin/ ... nt%20Exprs

Код: Выделить всё

Statements and Declarations in Expressions
 ==========================================
 
    A compound statement enclosed in parentheses may appear as an
 expression in GNU C.  This allows you to use loops, switches, and local
 variables within an expression.
 
    Recall that a compound statement is a sequence of statements
 surrounded by braces; in this construct, parentheses go around the
 braces.  For example:
 
      ({ int y = foo (); int z;
         if (y > 0) z = y;
         else z = - y;
         z; })
 
 is a valid (though slightly more complex than necessary) expression for
 the absolute value of `foo ()'.
Аватара пользователя
Akrav
Графоман
Сообщения: 12527
Зарегистрирован: 17 июн 2003, 13:30

Сообщение Akrav »

Ну и ладно.
Только я такими вещами пользоваться не буду.
И вот почему.
Если я напишу программу для индивидуальных свойств одного компилятора, то завтра я не смогу использовать её для другого компилятора. Теряется одно из преимуществ языка высокого уровня.
Знаете, когда я был советским инженером в академии наук, любое изделие сделаное на коленке без учета совместимости с чем бы то ни было очень приветствовалось. Но после эмиграции, многое пришлось переоценить.
Вот вспомнил хороший пример. Serial I2C ЕЕПРОМ of Microchip может записывать за раз 64 байта, что облегчает алгоритм записи по сравнению с возможностью записывать только 8 байт у всех остальных. Как советский инженер (больше одного экземпляра устройства мне делать не приходилось), я бы взял Microchip EEPROM и написал бы более простой обработчик. Но при изготовлении mass-production существует такое понятие как second source. Вот например у поставщика сгорел завод или кончил он производить устаревший по его мнению chip. Такое потрясение не должно отразиться на производстве того что я разрабатываю.
С учетом вышесказанного, я не буду считать специфические свойства какого-нибудь компонента легитимными и никогда не буду их использовать.
Считайте это моей жизненной позицией.
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

drain bamage
,
Вы правы. Код совершенно нормальный для гну. Прикольно. Думаю, кому то и полезно, т.к. позволяет промоделировать своего рода "жёсткий" inline, там, где компиллятор отказался бы выполнять эти директивы. Т.е бысто руками "вбить" кусок кода, где маскируются переменные, и Вы можете чувствовать себя вполно комфортно, не заботясь о перезагрузке имён.

FreeBSD 4.7, gcc:
int a = ({2;}); -
работает
int a = ({2;3;}); -
работает
!!! Возвращает 3. Что собственно и должно быть для блока.

Win32:
В VC++7.0 - не работает.
В BC++ - не работает для всех четырёх нотаций языков (Borland, ANSI, K&R,Unix V).

Так, что, на мой взгляд, ЭТО языковое расширение gcc. Остаётся правда вопрос, что будет, если настройки (опции командной строки) gcc порихтовать в части языка, а не использовать по умолчанию? Сам не буду смотреть. Времени нет.

На сём, дорогой drain bamage, и заканчиваю своё повествование в этом топике, поскольку философией не интересуюсь (это не в Ваш адрес). Пошёл бабки зарабатывать. У меня огород есть. Там много работы. Считайте это моей жизненной про-американской позицией.
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Просто для информации

Сообщение vg »

Для всех кому интересно про блоки. Мы здесь недавно обсуждали полезности и неполезности.
За много лет кодирования на С/C++ мне ни разу не встречался профессиональный код с блоками.
Но вот, просматривая код класса CSplitterWnd (MFC, VC++.NET), где мне надобыло посмотреть, как отрихтовать кое-что, наткнулся совершенно неожиданно:

Код: Выделить всё

//winsplitt.cpp
..
void CSplitterWnd::RecalcLayout()
{
...
	// size of scrollbars
	int cx = rectClient.right - rectInside.right;
	int cy = rectClient.bottom - rectInside.bottom;
...
[b]	//BLOCK: Reposition all the panes
	{[/b]		int x = rectClient.left;
		for (int col = 0; col < m_nCols; col++)
		{
			int cx = m_pColInfo[col].nCurSize;
			int y = rectClient.top;
			for (int row = 0; row < m_nRows; row++)
			{
				int cy = m_pRowInfo[row].nCurSize;
				CWnd* pWnd = GetPane(row, col);
				_AfxDeferClientPos(&layout, pWnd, x, y, cx, cy, FALSE);
				y += cy + m_cySplitterGap;
			}
			x += cx + m_cxSplitterGap;
		}
[b]	}[/b]...
}
Woozy
Завсегдатай
Сообщения: 278
Зарегистрирован: 03 мар 2003, 08:55
Откуда: RU->BC->ON->FI -> Chicago, IL -> Seattle, WA

Re: Просто для информации

Сообщение Woozy »

vg писал(а): За много лет кодирования на С/C++ мне ни разу не встречался профессиональный код с блоками.
С блоками? С {}? Не встречался за много лет? Мне только в этом примере "встретился" несколько раз.

Приведённый пример вовсе не напоминает "гнусную" специфику, с которой тут начали. Просто дополнительный {} сверху над циклом. So what?
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

Woozy
Добрый день.
Имелось в виду ровно то, что имелось в виду, см. тему моего предыдущего поста.
С блоками? С {}? Не встречался за много лет? Мне только в этом примере "встретился" несколько раз.
Имелось ввиду "обособленный" блок, не в составе if и тд.
...напоминает "гнусную" специфику...
Ты ли это, Woozy? :shock: Ты ж за чистоту родных ..... языков. Мож борланд дурландом назовёшь?
Woozy
Завсегдатай
Сообщения: 278
Зарегистрирован: 03 мар 2003, 08:55
Откуда: RU->BC->ON->FI -> Chicago, IL -> Seattle, WA

Сообщение Woozy »

vg писал(а):Имелось ввиду "обособленный" блок, не в составе if и тд.
Сколько угодно. Для изоляции переменных - очень просто. Не запрещено. Никакой специфики.
vg
Маньяк
Сообщения: 2803
Зарегистрирован: 29 май 2003, 22:29
Откуда: Магадан - Миссиссага

Сообщение vg »

Для изоляции переменных - очень просто. Не запрещено. Никакой специфики.
Спасибо, подсказал для чего, не дал умереть невеждой.
Сколько угодно
Мож кинешь хоть одну ссылку на сорс мелкософта (другие для меня не авторитет), т.е. файло - такое, функция - такая.
Если сколько угодно, то, думаю, ты не будешь искать два дня.
Woozy
Завсегдатай
Сообщения: 278
Зарегистрирован: 03 мар 2003, 08:55
Откуда: RU->BC->ON->FI -> Chicago, IL -> Seattle, WA

Сообщение Woozy »

vg писал(а):Если сколько угодно, то, думаю, ты не будешь искать два дня.
Только потому, что это в принципе трудно искать поисковиками. Или я не представляю. Сам видел, не раз, у них, специально искать не буду, набреду - покажу. Тут MS ни при чём. Это индивидуальный стиль программиста. Им тоже не запрещено. Это не принципиально и не интересно. Оригинальный вопрос этой темы был хоть немного интересным.
Ответить