кому c quiz ?
Правила форума
Пожалуйста, ознакомьтесь с правилами данного форума
Пожалуйста, ознакомьтесь с правилами данного форума
-
- Маньяк
- Сообщения: 2803
- Зарегистрирован: 29 май 2003, 22:29
- Откуда: Магадан - Миссиссага
-
- Завсегдатай
- Сообщения: 255
- Зарегистрирован: 19 мар 2003, 13:31
Re: кому c quiz ?
А какая польза тебе от этого? Вопрос дилетантский, но всё же, ведь должен быть смысл.drain bamage писал(а):Значит так. Вопрос я очевидно сформулировал плохо, перефразирую.
Является ли заключенный в круглые скобки statement block
Код: Выделить всё
({....})
разрешенной стандартом r-value конструкцией ?
- Akrav
- Графоман
- Сообщения: 12527
- Зарегистрирован: 17 июн 2003, 13:30
ИМХО ответ на главный вопрос очевиден. Стандарт такого не допускает.
Я не помню, чтобы это было где-то упомянуто и не полагался бы только на память, искать лень. Однако сообщение об ошибке, генерируемое наиболее популярными компиляторами может означать только два варианта. Менее вероятный, что все эти компиляторы имеют один баг и более вероятное, что блок может быть r-value не допускается стандартом.
Самое вольное место по теме это операция запятая.
Я не помню, чтобы это было где-то упомянуто и не полагался бы только на память, искать лень. Однако сообщение об ошибке, генерируемое наиболее популярными компиляторами может означать только два варианта. Менее вероятный, что все эти компиляторы имеют один баг и более вероятное, что блок может быть r-value не допускается стандартом.
Самое вольное место по теме это операция запятая.
- Akrav
- Графоман
- Сообщения: 12527
- Зарегистрирован: 17 июн 2003, 13:30
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. Или -- или. Обратите внимание, что статемент всегда образуется при помощи точки с запятой.
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
отнюдь не очевиден, особенно с учетом того, что стандартов как минимум два (c89 и c9x). поборов естественную лень и набрав "gcc language extensions" в гугле, нашел я собсно то, что и ожидалось -Akrav писал(а):ИМХО ответ на главный вопрос очевиден. Стандарт такого не допускает.
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
Ну и ладно.
Только я такими вещами пользоваться не буду.
И вот почему.
Если я напишу программу для индивидуальных свойств одного компилятора, то завтра я не смогу использовать её для другого компилятора. Теряется одно из преимуществ языка высокого уровня.
Знаете, когда я был советским инженером в академии наук, любое изделие сделаное на коленке без учета совместимости с чем бы то ни было очень приветствовалось. Но после эмиграции, многое пришлось переоценить.
Вот вспомнил хороший пример. Serial I2C ЕЕПРОМ of Microchip может записывать за раз 64 байта, что облегчает алгоритм записи по сравнению с возможностью записывать только 8 байт у всех остальных. Как советский инженер (больше одного экземпляра устройства мне делать не приходилось), я бы взял Microchip EEPROM и написал бы более простой обработчик. Но при изготовлении mass-production существует такое понятие как second source. Вот например у поставщика сгорел завод или кончил он производить устаревший по его мнению chip. Такое потрясение не должно отразиться на производстве того что я разрабатываю.
С учетом вышесказанного, я не буду считать специфические свойства какого-нибудь компонента легитимными и никогда не буду их использовать.
Считайте это моей жизненной позицией.
Только я такими вещами пользоваться не буду.
И вот почему.
Если я напишу программу для индивидуальных свойств одного компилятора, то завтра я не смогу использовать её для другого компилятора. Теряется одно из преимуществ языка высокого уровня.
Знаете, когда я был советским инженером в академии наук, любое изделие сделаное на коленке без учета совместимости с чем бы то ни было очень приветствовалось. Но после эмиграции, многое пришлось переоценить.
Вот вспомнил хороший пример. Serial I2C ЕЕПРОМ of Microchip может записывать за раз 64 байта, что облегчает алгоритм записи по сравнению с возможностью записывать только 8 байт у всех остальных. Как советский инженер (больше одного экземпляра устройства мне делать не приходилось), я бы взял Microchip EEPROM и написал бы более простой обработчик. Но при изготовлении mass-production существует такое понятие как second source. Вот например у поставщика сгорел завод или кончил он производить устаревший по его мнению chip. Такое потрясение не должно отразиться на производстве того что я разрабатываю.
С учетом вышесказанного, я не буду считать специфические свойства какого-нибудь компонента легитимными и никогда не буду их использовать.
Считайте это моей жизненной позицией.
-
- Маньяк
- Сообщения: 2803
- Зарегистрирован: 29 май 2003, 22:29
- Откуда: Магадан - Миссиссага
,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, и заканчиваю своё повествование в этом топике, поскольку философией не интересуюсь (это не в Ваш адрес). Пошёл бабки зарабатывать. У меня огород есть. Там много работы. Считайте это моей жизненной про-американской позицией.
-
- Маньяк
- Сообщения: 2803
- Зарегистрирован: 29 май 2003, 22:29
- Откуда: Магадан - Миссиссага
Просто для информации
Для всех кому интересно про блоки. Мы здесь недавно обсуждали полезности и неполезности.
За много лет кодирования на С/C++ мне ни разу не встречался профессиональный код с блоками.
Но вот, просматривая код класса CSplitterWnd (MFC, VC++.NET), где мне надобыло посмотреть, как отрихтовать кое-что, наткнулся совершенно неожиданно:
За много лет кодирования на С/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]...
}
-
- Завсегдатай
- Сообщения: 278
- Зарегистрирован: 03 мар 2003, 08:55
- Откуда: RU->BC->ON->FI -> Chicago, IL -> Seattle, WA
Re: Просто для информации
С блоками? С {}? Не встречался за много лет? Мне только в этом примере "встретился" несколько раз.vg писал(а): За много лет кодирования на С/C++ мне ни разу не встречался профессиональный код с блоками.
Приведённый пример вовсе не напоминает "гнусную" специфику, с которой тут начали. Просто дополнительный {} сверху над циклом. So what?
-
- Маньяк
- Сообщения: 2803
- Зарегистрирован: 29 май 2003, 22:29
- Откуда: Магадан - Миссиссага
Woozy
Добрый день.
Имелось в виду ровно то, что имелось в виду, см. тему моего предыдущего поста.
Ты ж за чистоту родных ..... языков. Мож борланд дурландом назовёшь?
Добрый день.
Имелось в виду ровно то, что имелось в виду, см. тему моего предыдущего поста.
Имелось ввиду "обособленный" блок, не в составе if и тд.С блоками? С {}? Не встречался за много лет? Мне только в этом примере "встретился" несколько раз.
Ты ли это, Woozy?...напоминает "гнусную" специфику...

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