![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
Brutaller |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 27.8.2006 Репутация: нет Всего: 1 |
Решил вот освоиться в сях для общего развития. До этого имел дело с Delphi и ассемблером, особых трудностей не возникало. По советам многих взял книгу "Язык программирования Си" (Керниган Б., Ритчи Д.) Дошел до 34-й страницы, пункт 1.5.3 "Подсчет строк" и... грабли.
Вот собственно код примера из книжки:
Если его скомпилить как есть, то я вообще не понимаю как эта консоль может завершиться при вводе чего либо. Может это какие то *nix особенности? ![]() while ((c = getchar())!=EOF) на while ( ((c = getchar())!=EOF) && (c!='q') ) Всё гуд, теперь после ввода "q" и нажатия Enter программа нормально завершается и выводит кол-во введённых строк. Решил усложнить немного, чтобы теперь программа завершалась ни только при вводе "q", но и при вводе "Q" (в верхнем регистре). И попробовал два варианта: 1-й: while ( ((c = getchar())!=EOF) && (c!='q') && (c!='Q') ) 2-й: while ( ((c = getchar())!=EOF) && ((c!='q') && (c!='Q')) ) Всё работает, программа завершается и при вводе "q" и при вооде "Q" , но... Вопрос вот в чем. Почему и в первом и во втором случае результат один и тот же, т.е. оно даже компилируется одинаково (в отладчике смотрел). Хотя по моему мнению, 2-й вариант(в котором два последних условия заключены в общие скобки) вообще не должен принимать истинное значение никогда. Проясните пожалуйста ситуацию, может быть я просто во что то не въезжаю? |
|||
|
||||
JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 6 Всего: 162 |
||||
|
||||
Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 2 Всего: 67 |
Brutaller, о.О
оба варианта совершенно идентичны по-вашему выражения: 1) А && B 2) (A && B) различны? -------------------- СУВ, Partizan. |
|||
|
||||
Brutaller |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 27.8.2006 Репутация: нет Всего: 1 |
Странно. Ведь первое выражение всегда "истина" в конкретном примере.
А вот во втором случае, если я ввожу например маленькую "q", то что получается? (c!='q') - FALSE (c!='Q') - TRUE ((FALSE) && (TRUE)) что будет в итоге? Не FALSE ли случаем ? Вроде как FALSE. А первое выражение, то которое у нас ((c = getchar())!=EOF) является TRUE. Соответственно ((TRUE) && (FALSE)) что даст? Как вообще вычисляются выражения, в какой последовательности? Или это я до такой степени не въезжаю в смысл СИ, или не знаю тогда ![]() |
|||
|
||||
Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 2 Всего: 67 |
Brutaller, с чем связан вопрос - не понятно...здесь же всё очевидно....
выражения 1-й: while ( ((c = getchar())!=EOF) && (c!='q') && (c!='Q') ) 2-й: while ( ((c = getchar())!=EOF) && ((c!='q') && (c!='Q')) ) эквивалентны В чём по-вашему отличие первого выражения от второго??? -------------------- СУВ, Partizan. |
|||
|
||||
Brutaller |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 27.8.2006 Репутация: нет Всего: 1 |
Вроде и так уже довольно подробно расписал всё. Хорошо, попробую еще раз.
В 1-м варианте выражение состоит из трёх частей и вычисляются они последовательно слева направо, так? Не вопрос, всё понятно. Но во 2-м то случае два последних выражения заключены в скобки и вроде как должно вычисляться "логическое И" между этими двумя выражениями, а уже над полученным результатом производится "логическое И" между самой первой частью и тем что получилось, так? И во втором то случае я ввожу только один из символов "q" или "Q" и результатом не может быть TRUE. Соответственно и всё выражение целиком тоже не может быть TRUE. В чем подвох ? ![]() |
|||
|
||||
Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 2 Всего: 67 |
Brutaller, так когда вы в первом случае вводите q или Q выражение тоже принимает значение False
например q первое выражение: TRUE && TRUE && FALSE == FALSE второе выражение: TRUE && (TRUE && FALSE) == FALSE; если вы вводите Q, то первое выражение: TRUE && FALSE && TRUE == FALSE; второе выражение: TRUE && (FALSE && TRUE) == FALSE; могу лишь вам сказать что при вводе Q, вычисление этих выражений будет несколько быстрее =) Это сообщение отредактировал(а) Partizan - 25.7.2008, 20:14 -------------------- СУВ, Partizan. |
|||
|
||||
Brutaller |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 27.8.2006 Репутация: нет Всего: 1 |
Во блин! Как это я сразу не заметил?
![]() Partizan, огромное спасибо! Вывел на свет ![]() Вот если бы сразу сам расписал так логику по составляющим, то и проблемы не возникло бы. ![]() Еще раз спасибо. Partizan +3 Это сообщение отредактировал(а) Brutaller - 25.7.2008, 20:11 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |