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

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

Восстановить пароль Регистрация
 
Fobos315
2 / 2 / 0
Регистрация: 25.04.2014
Сообщений: 68
01.08.2014, 12:08     Почему не проверяется условие else if #1
Что то я в упор не вижу почему не проверяет условие else if
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    setlocale(0, "");
    int a,b,c;
    double D;
    cout<<"Ââåäèòå ГЇГ*Г°Г*ìåòðû a, b ГЁ c \n";
    cin>>a; cin>>b; cin>>c;
    D=b*b-4*a*c;
    cout<<"D = "<<D<<endl;
    if (D>0)
    {
        cout<<"x1 = "<<(-b+sqrt(D))/(2*a)<<endl;
        cout<<"x2 = "<<(-b-sqrt(D))/(2*a)<<endl;
    }
    else if (D=0)
        cout<<"x = "<<(-b)/2*a<<endl; 
    else
    {
        cout<<"x1 = "<<(-b)<<" + i * "<<sqrt(4*a*c-b*b)<<endl;
        cout<<"x2 = "<<(-b)<<" - i * "<<sqrt(4*a*c-b*b)<<endl;
    }
    return 0;
}
Допустим a=2 b=4 c=2 D=0 благополучно пропускает это условие и переходит к else
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
jurok_85
226 / 209 / 70
Регистрация: 21.02.2013
Сообщений: 494
01.08.2014, 12:16     Почему не проверяется условие else if #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
else if (D==0)
Fobos315
2 / 2 / 0
Регистрация: 25.04.2014
Сообщений: 68
01.08.2014, 12:18  [ТС]     Почему не проверяется условие else if #3
jurok_85 мда что то я от паскаля про этот момент забываю, спасибо!
gru74ik
Модератор
 Аватар для gru74ik
3120 / 1346 / 167
Регистрация: 20.02.2013
Сообщений: 3,847
Записей в блоге: 17
01.08.2014, 20:54     Почему не проверяется условие else if #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от 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 будет выполнен — очень распространенная ошибка, которую трудно обнаружить.
(Однако многие компиляторы будут выдавать предупреждение, на которое разумно
обратить внимание.) В качестве общего правила запомните следующее: написать код, позво-
ляющий компилятору обнаружить ошибку, гораздо легче, чем разбираться с непонятными
мистическими результатами неверного выполнения программ.
Fobos315
2 / 2 / 0
Регистрация: 25.04.2014
Сообщений: 68
01.08.2014, 21:31  [ТС]     Почему не проверяется условие else if #5
gru74ik Если я вспомню что так надо сделать, то я наверное и вспомню что вместо = нужно == (возможно). Как и в моем случае))
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,133
Записей в блоге: 26
02.08.2014, 13:55     Почему не проверяется условие else if #6
Оффтоп, но выскажусь по этому поводу. Сначала люди начинают писать "3 == x". Потом их начинает раздражать несимметрия между "3 == x" и "x != 3", и поэтому начинают писать "3 != x", "3 < x" и т. д. Кончается тем, что вместо естественной и понятной записи типа

C
if ((x >= 3 && x <= 10) && (y >= 5 && y <= 20))
пишут

C
if ((3 <= x && 10 >= x) && (5 <= y && 20 >= y))
и в такие записи нужно очень долго вкуривать, не говоря о том, что они являются источниками логических ошибок, которые разбирать намного сложнее, чем ошибки типа той, что написано в первом посте

Вместо того, чтобы заниматься идиотизмом с записями типа "3 == x", лучше писать "x == 3" и научиться читать предупреждения компилятора, потому что все современные компиляторы умеют выдавать предупреждения при написании кода типа "if (x=3)". И не превращать программу в трудно читаемый гавнокод
CyberSolver
 Аватар для CyberSolver
101 / 74 / 17
Регистрация: 23.07.2014
Сообщений: 686
Записей в блоге: 1
02.08.2014, 14:28     Почему не проверяется условие else if #7
Цитата Сообщение от gru74ik Посмотреть сообщение
Вот та же самая мысль у Стивена Праты
Блин, а я думаю почему же все мои знакомые передают эту священную мудрость про 3 == x. Вот и на форуме... Полностью присоединяюсь к мнению предыдущего оратора: это нечитаемо и никаких проблем не решает. Если кто-то ниасилил ключи типа -Wall -pedantic - его проблемы.
gru74ik
Модератор
 Аватар для gru74ik
3120 / 1346 / 167
Регистрация: 20.02.2013
Сообщений: 3,847
Записей в блоге: 17
02.08.2014, 14:34     Почему не проверяется условие else if #8
Цитата Сообщение от Evg Посмотреть сообщение
Вместо того, чтобы заниматься идиотизмом с записями типа "3 == x", лучше писать "x == 3" и научиться читать предупреждения компилятора, потому что все современные компиляторы умеют выдавать предупреждения при написании кода типа "if (x=3)". И не превращать программу в трудно читаемый гавнокод
Хмм... Аргументация понятна. В принципе, логичная позиция. И учитывая, что я совсем новичок, а Вы - эксперт С++, даже соглашусь с Вами.
Непонятно только одно, на кой ляд Прата тогда такой совет даёт? Из каких соображений, если на практике лучше делать, как советуете Вы?

Добавлено через 2 минуты
Цитата Сообщение от CyberSolver Посмотреть сообщение
Полностью присоединяюсь к мнению предыдущего оратора: это нечитаемо и никаких проблем не решает. Если кто-то ниасилил ключи типа -Wall -pedantic - его проблемы.
Тем более. Тогда совет Стивена совсем в категорию вредных советов попадает, так выходит.
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,133
Записей в блоге: 26
02.08.2014, 15:12     Почему не проверяется условие else if #9
Цитата Сообщение от gru74ik Посмотреть сообщение
на кой ляд Прата тогда такой совет даёт?
Я не знаю, сколько лет товарищу, но подозреваю, что он программировал во времена, когда памяти на машинах было мало, а потому выдача предупреждений компилятором являлась непозволительной роскошью. Т.е. начинающему программисту без предупреждений со стороны компилятора такие проблемы "на глаз" увидеть сложно, а потому в те времена такой совет ещё можно было считать актуальным. Но со временем рука набивается и наличие "=" внутри if'а начинает сразу же резать глаза, а потому и без всяких предупреждений проблема видна с одного взгляда.

Нужно хорошо понимать, что "кто может - тот работает, кто не может - тот учит". Поэтому, не взирая на все заслуги авторов книг, не стоит их советы рассматривать как истину последней инстанции. Человек может быть уверен в своих советах на все 100%, но склад мышления каждого отдельно взятого человека - разный. А потому то, что удобно одному, совсем не удобно другому

Добавлено через 49 секунд
Цитата Сообщение от gru74ik Посмотреть сообщение
Тогда совет Стивена совсем в категорию вредных советов попадает, так выходит
Я бы сказал, он попадает в категорию "для теоретиков"
intern
 Аватар для intern
15 / 15 / 6
Регистрация: 30.03.2014
Сообщений: 67
Завершенные тесты: 1
02.08.2014, 15:27     Почему не проверяется условие else if #10
Как по мне, то вместо
C++
1
if (D==0)
проще использовать
C++
1
if (!D)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2014, 15:42     Почему не проверяется условие else if
Еще ссылки по теме:

C++ Не проверяется условие
Почему не работает условие в While? C++
Почему всегда выполняется условие? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16828 / 5249 / 321
Регистрация: 30.03.2009
Сообщений: 14,133
Записей в блоге: 26
02.08.2014, 15:42     Почему не проверяется условие else if #11
Забыл написать, что бывают случаи, когда внутри условия действительно пишут присваивание, а не сравнение. Казалось бы, что такие коды лучше переписать. Т.е. для if'а вместо

C
if (x=a)
лучше написать

C
x = a;
if (x)
Но в сложных случаях такую замену написать нетривиально:

C
if ((x = func1() && func2(x) < 10)
    || (y = func3() && func4(y) < 10))
или

C
while (x = func())
Другими словами, существуют реально востребованные случаи, когда внутри условия действительно было бы эффективным написать оператор присваивания. А потому выдача предупреждения со стороны компилятора является избыточной. По негласному соглашению в таких случаях обычно экранируют присваивание дополнительной парой скобок, чтобы компилятор различал случаи, в которых действительно не надо выдавать предупреждение

C
if (x = a) /* предупреждение есть */
if ((x = a)) /* предупреждения нет */
Добавлено через 5 минут
Цитата Сообщение от intern Посмотреть сообщение
Как по мне, то вместо
C++
1
if (D==0)
проще использовать
C++
1
if (!D)
Вопрос исключительно религиозный.

В таких случаях я руководствуюсь следующей логикой. Если D имеет по смыслу булевский тип (т.е. 0 = нет, остальное = да), то пишу if (!D). Если D имеет целочисленный тип, то пишу if (D == 0). При таком подходе меньше возникает пониманий со сложными конструкциями

C
if (is_a_ok && !is_b_ok && (is_c_ok || is_d_ok))
понимать проще, чем

C
if (is_a_ok == true && is_b_ok == false && (is_c_ok == true || is_d_ok == true))
Точно так же код

C
if (a == 0 && b != 0 && (c == 0 || d == 0))
понимать проще, чем

C
if (a && !b && (!c || !d))
Yandex
Объявления
02.08.2014, 15:42     Почему не проверяется условие else if
Ответ Создать тему
Опции темы

Текущее время: 16:29. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru