Страница 3 из 3
Добавлено: 04 июл 2003, 19:32
vg
Музчины!
Кто ещё хочет на меня ругаться, ещё хочет коммисарского тела, знайте - я пошёл домой. Могу посмотреть только завтра. У нас здесь в России суббота сеодня.
Пока.
Re: кому c quiz ?
Добавлено: 04 июл 2003, 19:43
ilid
drain bamage писал(а):Значит так. Вопрос я очевидно сформулировал плохо, перефразирую.
Является ли заключенный в круглые скобки statement block
разрешенной стандартом r-value конструкцией ?
А какая польза тебе от этого? Вопрос дилетантский, но всё же, ведь должен быть смысл.
Добавлено: 04 июл 2003, 22:33
Akrav
Если кому надо могу прислать Кернигана по мылу. Только укажите на каком языке (русский или английский or both).
Добавлено: 04 июл 2003, 22:42
Akrav
ИМХО ответ на главный вопрос очевиден. Стандарт такого не допускает.
Я не помню, чтобы это было где-то упомянуто и не полагался бы только на память, искать лень. Однако сообщение об ошибке, генерируемое наиболее популярными компиляторами может означать только два варианта. Менее вероятный, что все эти компиляторы имеют один баг и более вероятное, что блок может быть r-value не допускается стандартом.
Самое вольное место по теме это операция запятая.
Добавлено: 04 июл 2003, 22:50
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. Или -- или. Обратите внимание, что статемент всегда образуется при помощи точки с запятой.
Добавлено: 05 июл 2003, 00:18
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 ()'.
Добавлено: 05 июл 2003, 06:17
Akrav
Ну и ладно.
Только я такими вещами пользоваться не буду.
И вот почему.
Если я напишу программу для индивидуальных свойств одного компилятора, то завтра я не смогу использовать её для другого компилятора. Теряется одно из преимуществ языка высокого уровня.
Знаете, когда я был советским инженером в академии наук, любое изделие сделаное на коленке без учета совместимости с чем бы то ни было очень приветствовалось. Но после эмиграции, многое пришлось переоценить.
Вот вспомнил хороший пример. Serial I2C ЕЕПРОМ of Microchip может записывать за раз 64 байта, что облегчает алгоритм записи по сравнению с возможностью записывать только 8 байт у всех остальных. Как советский инженер (больше одного экземпляра устройства мне делать не приходилось), я бы взял Microchip EEPROM и написал бы более простой обработчик. Но при изготовлении mass-production существует такое понятие как second source. Вот например у поставщика сгорел завод или кончил он производить устаревший по его мнению chip. Такое потрясение не должно отразиться на производстве того что я разрабатываю.
С учетом вышесказанного, я не буду считать специфические свойства какого-нибудь компонента легитимными и никогда не буду их использовать.
Считайте это моей жизненной позицией.
Добавлено: 05 июл 2003, 18:27
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, и заканчиваю своё повествование в этом топике, поскольку философией не интересуюсь (это
не в Ваш адрес). Пошёл бабки зарабатывать. У меня огород есть. Там много работы. Считайте это моей жизненной про-американской позицией.
Просто для информации
Добавлено: 09 июл 2003, 20:58
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]...
}
Re: Просто для информации
Добавлено: 10 июл 2003, 07:48
Woozy
vg писал(а):
За много лет кодирования на С/C++ мне ни разу не встречался профессиональный код с блоками.
С блоками? С {}? Не встречался за много лет? Мне только в этом примере "встретился" несколько раз.
Приведённый пример вовсе не напоминает "гнусную" специфику, с которой тут начали. Просто дополнительный {} сверху над циклом. So what?
Добавлено: 10 июл 2003, 14:03
vg
Woozy
Добрый день.
Имелось в виду ровно то, что имелось в виду, см.
тему моего предыдущего поста.
С блоками? С {}? Не встречался за много лет? Мне только в этом примере "встретился" несколько раз.
Имелось ввиду "обособленный" блок, не в составе if и тд.
...напоминает "гнусную" специфику...
Ты ли это, Woozy?

Ты ж за чистоту родных ..... языков. Мож борланд дурландом назовёшь?
Добавлено: 10 июл 2003, 15:12
Woozy
vg писал(а):Имелось ввиду "обособленный" блок, не в составе if и тд.
Сколько угодно. Для изоляции переменных - очень просто. Не запрещено. Никакой специфики.
Добавлено: 10 июл 2003, 16:22
vg
Для изоляции переменных - очень просто. Не запрещено. Никакой специфики.
Спасибо, подсказал для чего, не дал умереть невеждой.
Сколько угодно
Мож кинешь хоть одну ссылку на сорс мелкософта (другие для меня не авторитет), т.е. файло - такое, функция - такая.
Если сколько угодно, то, думаю, ты не будешь искать два дня.
Добавлено: 10 июл 2003, 17:11
Woozy
vg писал(а):Если сколько угодно, то, думаю, ты не будешь искать два дня.
Только потому, что это в принципе трудно искать поисковиками. Или я не представляю. Сам видел, не раз, у них, специально искать не буду, набреду - покажу. Тут MS ни при чём. Это индивидуальный стиль программиста. Им тоже не запрещено. Это не принципиально и не интересно. Оригинальный вопрос этой темы был хоть немного интересным.