| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Для новичков > Выражение в С++, что это ? |
| Автор: EvilsInterrupt 7.1.2010, 00:33 | ||||
| Есть такая ситуация, читая про С++ книгу Эккеля увидел: что автор говорит о том, что такая строчка не работает:
но работает такая:
т.е. без скобочек. Недолго думая, тут же создал proba.cpp и действительно! Почитав пояснение, не совсем понял его. Пояснение сводится к тому что в выражениях недопустимы скобочки. Не остановился и решил поискать терминологию, а что собственно является выражением в С++ и ... пока не нашел ( Прошу, подсказать мне в чем фокус ? Почему пример, когда выделено в скобочки, не работает ? |
| Автор: _GRIN_ 7.1.2010, 01:04 |
| EvilsInterrupt, суть в том, что переменная char c видна только внутри тех скобок, где она объявлена, следовательно при сравнении на неравенство с символом 'С' слева от знакак неравенства по сути ничего нет (как только вышли из скобок переменная "потерялась"). Нормальный компилятор с лишними скобками не скомпилит. |
| Автор: andrew_121 7.1.2010, 01:17 |
| g++ не компилит. Добавлено через 32 секунды у тебя какой компилятор? |
| Автор: xvr 7.1.2010, 12:15 | ||||||||
Суть сводится к тому, что в while(char c=cin.get() != 'C') внутри while использованно НЕ выражение Стандарт:
Во втором же случае
|
| Автор: zim22 7.1.2010, 13:35 |
| пол-года назад я тоже задавал подобные вопросы вот тема: http://forum.vingrad.ru/forum/topic-264505.html |
| Автор: EvilsInterrupt 7.1.2010, 16:04 |
| все равно не понял, вернусь к этому вопросу позже, спасибо за внимание ;) |
| Автор: A5uKa 7.1.2010, 23:29 | ||
а разве get() не выполнится перед этим ? п.с. мне всегда казалось, что в этом случае сравнивается даже не значение char, а результат операции присвоения :S |
| Автор: xvr 7.1.2010, 23:52 | ||||||||
А чего тут непонятного? В while, if, for и пр. в качестве условия можно использовать выражение или определение переменной. В последнем случае именно значение этой переменной и становится условием. Определять переменные внутри выражения нельзя.
Запись while(char c=cin.get() != 'C') приблизительно эквивалентна такой
|
| Автор: A5uKa 8.1.2010, 00:07 | ||||||||||
Я не о том... Я просто хочу сказать, что сравнение идёт не с переменной.
присвоение происходит после сравнения. Точнее присвоения вообще НЕ происходит, при выходе из тела if или while оно вернётся и станет тем, чем было. то есть не
а
|
| Автор: mes 8.1.2010, 00:41 | ||
имхо с for смотрится симпатичнее :
хотя тоже не до конца соответсвует примеру.. |
| Автор: A5uKa 8.1.2010, 00:55 | ||||
почему ? только не понимаю зачем вообще char переменная тут у
Ведь в условии присвоения не происходит. |
| Автор: A5uKa 8.1.2010, 01:13 | ||||||
Только НЕ этого тела, а того, что в круглых скобках после равно То есть вообще не будем. Можете cout << c; для примера поставить... п.с. рекурсия ещё лучше :P |
| Автор: mes 8.1.2010, 02:16 | ||||
Вы имеете ввиду что
позвольте тогда узнать куда девалось выше присвоенное значение ? а также что хранит тогда сейчас c ? неужто мусор ? или может та "c" в теле цикла не существует ? _________________ | хочу подробностей | |_________________| | | |
| Автор: A5uKa 8.1.2010, 02:33 | ||||||
Именно это я и хочу сказать.
Я могу соврать, если скаже, что присвоения как такового не было вообще, но я его не наблюдаю
Грязный и вонючий вот ещё пример
на самом деле сравнивается j и 5 А i вообще не при делах выводится единицой. Бурной фантазией можно предположить почему int i = (int)(bool)(5==5) но как знать p.s. ну всё ... Вы наверное уснули =) Пойду и я спать ... |
| Автор: artsb 8.1.2010, 09:33 |
| A5uKa, все работает правильно: |
| Автор: mes 8.1.2010, 10:02 | ||||
А теперь давайте подумаем откуда взялась единица.. и почему если и то заменив == на != (ну или одну из 5 заменить другим значением) начнет выводиться ноль ?! ну и ответ: кстати он был дан еше в 4м посту и Вы его даще цитировали:
|
| Автор: A5uKa 8.1.2010, 12:39 | ||||
vcl60.bpl >____<
не знаю, но это было одной из моих догадок (Привидение с типа BOOL) в любом случае в Char мы получаем Смайли Не уж то (char)True == ' |
| Автор: mes 8.1.2010, 14:04 | ||
смайлик получите не в char а при выводе значения как char. напишите cout << (int)c; и увидите значение. ага. думаю Вам будет полезен для разбора этой ситуации следующий пример
|
| Автор: artsb 8.1.2010, 14:46 |
Проект на BCB 6 |
| Автор: A5uKa 8.1.2010, 14:47 | ||||||
Однако всё же я вывожу значение char как char , значит там всё же смайл
только зачем
|
| Автор: artsb 8.1.2010, 14:47 | ||
mes, может лучше так:
чтобы понятней было |
| Автор: A5uKa 8.1.2010, 14:50 | ||||||||
я знаю даже то, что кто-то не убрал галочки в свойствах проекта Добавлено @ 14:53
Тогда это уже не смайл И зачем
может вы имели ввиду
то, что 1 - это смайл, а - 0 соотвественно пробел ... ну я знаю >_< |
| Автор: artsb 8.1.2010, 14:54 |
Эт да. Чтобы по легче был. Я же не знал, что у тебя среды нет. Но судя по всему, он уже и не нужен. Уже и так разобрались. |
| Автор: A5uKa 8.1.2010, 15:00 | ||
Я боюсь устанавливать - ведь работать прийдётся >_< Завтра установлю и буду мучать мою старую тему про нашествие терминаторов http://forum.vingrad.ru/forum/topic-285001.html |
| Автор: mes 8.1.2010, 15:16 |
нет: я имел в ввиду именно 1+flag. Вы бы попробовали .. запустили бы.. Дело в том что служебные символы (с кодами 0-31) не ограничиваются одним смайликом.. в примере в зависимости от флага будет печататься либо норамльный, либо инверсный смайлик. |
| Автор: mes 8.1.2010, 15:33 | ||
вот набросал еще один примерчик, надеюсь поинтересней:
|
| Автор: mes 8.1.2010, 15:55 | ||
| чего то потянуло меня на консоль.. предыдущие два примера могут пригодиться при составлении консольной игры карты, вот еще один в довесок для определения значка пола противника :
|
| Автор: mes 8.1.2010, 16:17 | ||
| вот еще один примерчик..правда мало применимый, но для разбора пойдет : кричащий и мигающий смайлик;
|
| Автор: artsb 8.1.2010, 17:16 |
| mes сам себе приятный... |
| Автор: mes 8.1.2010, 17:56 |
сам себе это как ?! |
| Автор: artsb 8.1.2010, 18:54 |
т.е. никто тебе не нужен. Без обид |