Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выражение в С++, что это ? 
:(
    Опции темы
EvilsInterrupt
Дата 7.1.2010, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: нет
Всего: 9



Есть такая ситуация, читая про С++ книгу Эккеля увидел:

что автор говорит о том, что такая строчка не работает:
Код

while((char c=cin.get()) != 'C')


но работает такая:
Цитата

while(char c=cin.get() != 'C')


т.е. без скобочек. Недолго думая, тут же создал proba.cpp и действительно! Почитав пояснение, не совсем понял его. Пояснение сводится к тому что в выражениях недопустимы скобочки.

Не остановился и решил поискать терминологию, а что собственно является выражением в С++ и ... пока не нашел ( Прошу, подсказать мне в чем фокус ? Почему пример, когда выделено в скобочки, не работает ?
PM MAIL WWW ICQ Jabber   Вверх
_GRIN_
Дата 7.1.2010, 01:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


одинокий падаван
**


Профиль
Группа: Участник
Сообщений: 272
Регистрация: 18.11.2007
Где: Калуга

Репутация: нет
Всего: 7



EvilsInterrupt, суть в том, что  переменная char c видна только внутри тех скобок, где она объявлена, следовательно при сравнении на неравенство с символом 'С' слева от знакак неравенства по сути ничего нет (как только вышли из скобок переменная "потерялась"). Нормальный компилятор с лишними скобками не скомпилит.


--------------------
Дорогу осилит идущий
PM MAIL Skype   Вверх
andrew_121
Дата 7.1.2010, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 10
Всего: 33



g++ не компилит.

Добавлено через 32 секунды
у тебя какой компилятор?


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
xvr
Дата 7.1.2010, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата

Пояснение сводится к тому что в выражениях недопустимы скобочки.
Гм. Сильно  smile 
Суть сводится к тому, что в while(char c=cin.get() != 'C') внутри while использованно НЕ выражение
Стандарт:
Цитата


iteration-statement:
  while (conditionstatement

condition:
  expression
  type-spec-seq declarator = assignment-expression
Т.е. в конструкции
Код

while((char c=cin.get()) != 'C')
condition в while попадет в группу expression, и даст ошибку, т.к. определять переменные внутри выражений нельзя.
Во втором же случае
Код

while(char c=cin.get() != 'C')
это будет type-spec-seq declarator = ..., что синтаксически правильно, но врядли правильно семантически, т.к. в переменную c присвоится не введенный символ, а результат его сравнения с литерой 'C'

PM MAIL   Вверх
zim22
Дата 7.1.2010, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


Профиль
Группа: Завсегдатай
Сообщений: 2682
Регистрация: 15.1.2009
Где: Украина

Репутация: 29
Всего: 69



пол-года назад я тоже задавал подобные вопросы
вот тема: http://forum.vingrad.ru/forum/topic-264505.html


--------------------
PM MAIL   Вверх
EvilsInterrupt
Дата 7.1.2010, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Executables research
***


Профиль
Группа: Завсегдатай
Сообщений: 1019
Регистрация: 14.7.2007
Где: Железнодорожный, МО, Россия

Репутация: нет
Всего: 9



все равно не понял, вернусь к этому вопросу позже, спасибо за внимание ;)
PM MAIL WWW ICQ Jabber   Вверх
A5uKa
Дата 7.1.2010, 23:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


TЋ♥s F1rȜ iƧ BurȠiƞg
***


Профиль
Группа: Awaiting Authorisation
Сообщений: 1928
Регистрация: 30.8.2008

Репутация: 2
Всего: 16



Цитата

в переменную c присвоится не введенный символ, а результат его сравнения с литерой 'C'

а разве get() не выполнится перед этим ?

п.с. мне всегда казалось, что в этом случае сравнивается даже не значение char, а результат операции присвоения :S
PM   Вверх
xvr
Дата 7.1.2010, 23:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



Цитата(EvilsInterrupt @ 7.1.2010,  16:04)
все равно не понял, вернусь к этому вопросу позже, спасибо за внимание ;)

А чего тут непонятного? В while, if, for и пр. в качестве условия можно использовать выражение или определение переменной. В последнем случае именно значение этой переменной и становится условием.
Определять переменные внутри выражения нельзя.

Цитата

а разве get() не выполнится перед этим ?
Выполнится
Цитата

п.с. мне всегда казалось, что в этом случае сравнивается даже не значение char, а результат операции присвоения :S
Условие while в данном случае - это значение переменной. А значение переменной - это результат операции сравнения
Запись while(char c=cin.get() != 'C') приблизительно эквивалентна такой
Код

char c=(cin.get() != 'C');
while(c)
 {
   ...
   c=(cin.get() != 'C');
 }


PM MAIL   Вверх
A5uKa
Дата 8.1.2010, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


TЋ♥s F1rȜ iƧ BurȠiƞg
***


Профиль
Группа: Awaiting Authorisation
Сообщений: 1928
Регистрация: 30.8.2008

Репутация: 2
Всего: 16



Цитата

Цитата

сравнивается даже не значение char, а результат операции присвоения

....


Я не о том...

Я просто хочу сказать, что сравнение идёт не с переменной.
Код


    int x=0;
    if (x=2 == x)
        cout << "So";
    else
        cout << "Or So";

присвоение происходит после сравнения. Точнее присвоения вообще НЕ происходит, при выходе из тела if или while оно вернётся и станет тем, чем было.

то есть не 
Код

while(c)

а 
Код

while (то чему c равно)


Это сообщение отредактировал(а) A5uKa - 8.1.2010, 00:09
PM   Вверх
mes
Дата 8.1.2010, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(xvr @  7.1.2010,  22:52 Найти цитируемый пост)
char c=(cin.get() != 'C');
while©
 {
   ...
   c=(cin.get() != 'C');
 }


имхо с for смотрится симпатичнее :
Код

for  (char c; c = (cin.get() != 'C'); ) {...}

хотя тоже не до конца соответсвует примеру..



--------------------
PM MAIL WWW   Вверх
A5uKa
Дата 8.1.2010, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


TЋ♥s F1rȜ iƧ BurȠiƞg
***


Профиль
Группа: Awaiting Authorisation
Сообщений: 1928
Регистрация: 30.8.2008

Репутация: 2
Всего: 16



Цитата

имхо с for смотрится симпатичнее

почему ?

только не понимаю зачем вообще char переменная тут
у 
Код

char c;
for  (;cin.get() != 'C';) ; суть та же

Ведь в условии присвоения не происходит.
PM   Вверх
mes
Дата 8.1.2010, 01:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(A5uKa @  7.1.2010,  23:55 Найти цитируемый пост)
Ведь в условии присвоения не происходит.

как это не происходит ?

Цитата(A5uKa @  7.1.2010,  23:07 Найти цитируемый пост)
при выходе из тела if или while оно вернётся и станет тем, чем было.

а нам за телом и не нужно.. мы ее внутри тела будем использовать smile

Добавлено через 2 минуты и 24 секунды
ммм..  а что Вы называете телом while ? описание или блок цикла ?

Добавлено через 3 минуты и 58 секунд
Цитата(A5uKa @  7.1.2010,  23:55 Найти цитируемый пост)
Цитата

имхо с for смотрится симпатичнее


почему ?

потому что условие/присвоение пишется один раз.. т.е. нет копи-паста..



--------------------
PM MAIL WWW   Вверх
A5uKa
Дата 8.1.2010, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


TЋ♥s F1rȜ iƧ BurȠiƞg
***


Профиль
Группа: Awaiting Authorisation
Сообщений: 1928
Регистрация: 30.8.2008

Репутация: 2
Всего: 16



Цитата(mes @ 8.1.2010,  01:00)
Цитата(A5uKa @  7.1.2010,  23:55 Найти цитируемый пост)
Ведь в условии присвоения не происходит.

как это не происходит ?

Цитата(A5uKa @  7.1.2010,  23:07 Найти цитируемый пост)
при выходе из тела if или while оно вернётся и станет тем, чем было.

а нам за телом и не нужно.. мы ее внутри тела будем использовать smile

Добавлено @ 01:02
ммм..  а что Вы называете телом while ? описание или блок цикла ?

Код

for  (char c; c = (cin.get() != 'C'); )    
{ }

Только НЕ этого тела, а того, что в круглых скобках после равно
То есть вообще не будем.
Можете cout << c; для примера поставить...

п.с. рекурсия ещё лучше :P


Это сообщение отредактировал(а) A5uKa - 8.1.2010, 01:16
PM   Вверх
mes
Дата 8.1.2010, 02:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 79
Всего: 250



Цитата(A5uKa @  8.1.2010,  00:13 Найти цитируемый пост)
Только НЕ этого тела, а того, что в круглых скобках после равно
То есть вообще не будем.

Вы имеете ввиду что
Код

while(char c=std::cin.get() != 'C')
{
// здесь, в теле цикла c не будет равно результату приравнему выше ?
}


позвольте тогда узнать куда девалось выше присвоенное значение  ? 
а также что хранит тогда сейчас c ? неужто мусор ? 
или может та "c" в теле цикла не существует ?
 _________________ 
| хочу подробностей |
|_________________|
             |
             | smile 





--------------------
PM MAIL WWW   Вверх
A5uKa
Дата 8.1.2010, 02:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


TЋ♥s F1rȜ iƧ BurȠiƞg
***


Профиль
Группа: Awaiting Authorisation
Сообщений: 1928
Регистрация: 30.8.2008

Репутация: 2
Всего: 16



Именно это я и хочу сказать.

Цитата

куда девалось выше присвоенное значение  ? 

Я могу соврать, если скаже, что присвоения как такового не было вообще, но я его не наблюдаю smile

Цитата

неужто мусор ? 

Грязный и вонючий  smile 

вот ещё пример

Код

int j=5;
while(int i=j == 5)
{
    cout << i;
    cout << "FAIL";
}


на самом деле сравнивается j и 5 
А i вообще не при делах выводится единицой.
Бурной фантазией можно предположить почему int i = (int)(bool)(5==5) но как знать smile 

p.s. ну всё ... 
Вы наверное уснули =)
Пойду и я спать ... 

Это сообщение отредактировал(а) A5uKa - 8.1.2010, 02:51
PM   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0967 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.