Форум программистов, компьютерный форум CyberForum.ru

Почему не проверяется условие else if - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Application has failed to start because the application configuration is incorrect (+LNK4099, 4098) http://www.cyberforum.ru/cpp-beginners/thread1237164.html
Получил тестовое задание на джуна C++. Проект - Недоделанный арканоид на собственном движке конторы. Моя задача допилить игру. В задании 2 варианта solution'ов: под MS Visual Studio 2008 и под VS2010. (быть может это имеет значение - из этого предполагаю, что делался проект на VS2008, а к VS2010 уже адаптировали). Проект билдится, хотя и с 400+ warning'ами, большая часть из которых LNK4099...
C++ Множественное наследование - когда оно действительно нужно? Здравствуйте! До изучения языка C++ я программировал на языках типа Java и C#, где множественное наследование от классов явно запрещено. Долгое время после я обходился без этой возможности. Много тем в учебниках, где обсуждалось множественное наследование, были сопровождены примерами, но мне всегда казалось, что это можно выстроить гораздо красивее и логичней, совершенно не используя... http://www.cyberforum.ru/cpp-beginners/thread1237158.html
C++ Сортировка книг по убыванию года изнания
2) Написать программу сортировки книг в массиве структур по убыванию года издания
Скопировать одну структуру в другую C++
1) Написать программу копирования одной структуры (с информацией о книге) в другую
C++ Получить данные о службах Windows с возможностью управления ими http://www.cyberforum.ru/cpp-beginners/thread1237132.html
Всем привет! я новичок в программировании. Подскажите получить данные о службе, сколько берет оперативной памяти, запущена или нет. И возможность запустить ее или перезагрузить.
C++ Создание VPN сети, RAS API Здравствуйте, я создал небольшой чат, основанный на сокетах. Чтобы клиент подключился к серверу с другого ПК требуется VPN. Хотелось бы попробовать написать клиент для подключения к VPN сети, а еще лучше и сервер VPN к этому всему. Проблема в том, что не знаю с чего начать. Краем уха слышал про RAS API, однако толком разобраться не смог. С чего начать? Посоветуйте пожалуйста или киньте пару... подробнее

Показать сообщение отдельно
gru74ik
Модератор
Эксперт CЭксперт С++
3894 / 1652 / 188
Регистрация: 20.02.2013
Сообщений: 4,707
Записей в блоге: 21
01.08.2014, 20:54     Почему не проверяется условие else if
Цитата Сообщение от Fobos315 Посмотреть сообщение
мда что то я от паскаля про этот момент забываю
Поэтому пишите так:
C++
1
else if (0==D) // в условии оператора if сравнивается константа 0 со значением переменной D
Если Вы вдруг ошибётесь и по привычке напишете = вместо ==, компилятор выдаст ошибку с номером строки:
C++
1
else if (0=D) // Ошибка! Компилятор заругается: нельзя присвоить константе значение переменной!
Вы сразу поймёте в чём дело.

Более привычный вариант записи, которым воспользовались Вы:
C++
1
else if (D==0) // в условии оператора if сравнивается значение переменной D c константой 0
чреват возможностью допустить ошибку:
C++
1
2
3
else if (D=0)   // В условии оператора if переменной D присваивается значение 0.
                // Таким образом, условие оператора if всегда будет false и
                // программа всегда будет пропускать эту ветку кода.
(что с Вами и произошло).

С точки зрения компилятора такой вариант вполне корректен, но результат выполнения кода совсем не тот, что Вы задумывали. В итоге, в больших программах такую ошибку отловить будет совсем непросто.

Добавлено через 7 часов 53 минуты
Вот та же самая мысль у Стивена Праты в его замечательной книге "Язык программирования С++. Лекции и упражнения" (2013, 6-е издание):
Цитата Сообщение от Стивен Прата
Условные операции и предотвращение ошибок
Многие программисты превращают более интуитивно понятное выражение переменная
== значение
в значение == переменная, чтобы предотвратить ошибки, связанные С
опечатками, когда вместо операции проверки равенства (==) вводится операция
присваивания (=). Например, следующее условие корректно и будет работать правильно:
if (3 == myNumber)
Однако если допустить ошибку и ввести оператор, как показано ниже, то компилятор
выдаст сообщение об ошибке, поскольку расценит это как попытку присвоить значение
литералу (3 всегда равно 3, и ему нельзя присвоить ничего другого):
if (3 = myNumber)
Предположим, что сделана та же опечатка, но используется обычный формат:
if (myNumber =3)
В этом случае компилятор просто присвоит значение 3 переменной myNumber, и блок
внутри if будет выполнен — очень распространенная ошибка, которую трудно обнаружить.
(Однако многие компиляторы будут выдавать предупреждение, на которое разумно
обратить внимание.) В качестве общего правила запомните следующее: написать код, позво-
ляющий компилятору обнаружить ошибку, гораздо легче, чем разбираться с непонятными
мистическими результатами неверного выполнения программ.
 
Текущее время: 15:00. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru