Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
0 / 0 / 0
Регистрация: 06.09.2016
Сообщений: 17

Почему if ( x++ && y++) инкрементирует только x?

25.07.2020, 01:37. Показов 4744. Ответов 7

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Нашел код и не могу понять как он работает. Почему выводится 1 и как работает тут if? Почему игнорируется y += 2;?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
int main(int argc, char** argv)
{
    int x = 0;
    int y = 0;
 
    if (x++ && y++)
    {
        y += 2;
    }
    std::cout << x + y << std::endl;
    return 0;
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.07.2020, 01:37
Ответы с готовыми решениями:

Почему friend ostrem& operator <<(ostream& outs, const Rational&); - invalid function declaration?
Пытаюсь скомпилировать программу пишет friend ostrem&amp; operator &lt;&lt;(ostream&amp; outs, const Rational&amp;); - invalid function declaration. ...

Ошибка: multiple definition of `void std::swap<A>(A&amp;, A&amp;)
Хочу специализировать swap для своего класса. Получаю ошибку. Вот код:#ifndef A_H #define A_H #include &lt;string&gt; class A ...

Почему в выражении нельзя использовать запятую вместо &&
Привет всем, у меня такой вопрос: Почему в выражении for (i=0; i &lt; *k &amp;&amp; strcmp((base+i)-&gt;fam,fam); i++); вместо...

7
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602
25.07.2020, 01:51
Стандартная оптимизация логических выражений. false && что-то там всегда равно false. Значит, если слева от && вышло false, правую часть можно просто проигнорировать. x++ равно исходному значению x, исходное значение - ноль, ноль считается за false. Соответственно, оптимизация и срабатывает.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13183 / 6819 / 1821
Регистрация: 18.10.2014
Сообщений: 17,259
25.07.2020, 01:53
Лучший ответ Сообщение было отмечено mich_daniel как решение

Решение

Цитата Сообщение от mich_daniel Посмотреть сообщение
и как работает тут if
* Операнды оператора && вычисляются слева направо, полностью изолированно друг от друга. Сначала вычисляется первый операнд, вместе со всеми своими побочными эффектами. Затем вычисляется второй операнд.

* Если первый операнд является false, то второй операнд оператора && не вычисляется вообще. В этом случае сразу понятно, что результат всего && - тоже false.

В данном примере сначала вычисляется подвыражение x++ - первый операнд оператора &&. Значение этого выражения равно 0. Побочный эффект этого выражения увеличивает значение переменной x до 1.

В контексте оператора && 0 эквивалентно false. Так как первый операнд оператора && равен false, вычисления второго операнда не происходит вообще. Переменная y остается неизменной, т.е. равной 0.

Значение всего оператора && равно false, т.е. условие в if ложно и истинная ветка этого if выполняться не будет.

Цитата Сообщение от mich_daniel Посмотреть сообщение
Почему выводится 1
Итого, значения переменных после выполнения if: x = 1, y = 0. Потому и выводится 1.
0
0 / 0 / 0
Регистрация: 21.12.2016
Сообщений: 14
25.07.2020, 02:06
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
using namespace std;
int main(int argc, char** argv)
{
    int x = 0;
    int y = 0;
 
    if (x++ && y++) //x=0 прошел инкрементацию, x=1 записался, пошла операция считывания логического оператора, пришли к "y", а он равен =0, уже есть с чем сравнивать. По сути имеем if (1 && 0), ложь, условие не выполняется
    {
        y += 2;
    }
    std::cout << x + y << std::endl; // 0+1=1
    return 0;
}
В отладчике все это видно.
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13183 / 6819 / 1821
Регистрация: 18.10.2014
Сообщений: 17,259
25.07.2020, 02:43
Цитата Сообщение от oligozen Посмотреть сообщение
По сути имеем if (1 && 0), ложь, условие не выполняется
Совершенно не корректно. Никакого if (1 && 0) мы тут не имеем. Мы имеем if (0 && даже-не-смотрели)
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,536
Записей в блоге: 1
25.07.2020, 09:41
ты знаешь, чем x++ от ++x отличается?
0
 Аватар для zytia
24 / 15 / 10
Регистрация: 11.06.2019
Сообщений: 162
25.07.2020, 13:47
Смотри, если ты ставишь оператор ++ после переменной, то у тебя сначала проверится условие, а только потом добавиться одно значение к переменной. В качестве примера приведу вот такую запись:
C++
1
2
3
4
5
6
7
8
int main()
{
    int x = 0;
    std::cout << x++ << std::endl; // Вывод: 0
    // Но если мы выведем эту переменную после, то уже будет 1
    std::cout << x<< std::endl; // Вывод: 1
    return 0;
}
Если же мы оператор поставим перед переменной, то значение будет равно одному.
C++
1
2
3
4
5
6
7
int main()
{
    int x = 0;
    std::cout << ++x << std::endl; // Вывод: 1
    std::cout << x<< std::endl; // Вывод: 1
    return 0;
}
А так, как в условии у тебя одна переменная(x) равна нулю, то конструкция после if в случае true не будет выполнена, а переменной y после проверки условия добавляется единица. Отсюда и ответ 1.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
25.07.2020, 13:55
все написали кроме типичной ссылки

Добавлено через 1 минуту
спасибо Croessmah, за ссылку на стандарт с регулярно обновляющимся контентом. (мы тебя не забыли)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.07.2020, 13:55
Помогаю со студенческими работами здесь

Почему в инструкции if (x++ && y++) {} инкремент первой переменной срабатывает, а второй - нет?
int main(int argc, char** argv) { int x = 0; int y = 0; if (x++ &amp;&amp; y++) { y += 2; }

Объясните почему не срабатывает И (&&)
Есть задача нахождения наибольшего общего делителя для двух чисел. Программу я написал.Но почему когда я указывал в цикле И (&amp;&amp;),...

В заштрихованную фигуру бросают точки с координатами x и y. Получить координаты первой точки не попавшей в эту область (фигура x*x+y*y<25&&x*x+y*y>=9&
В заштрихованную фигуру бросают точки с координатами x и y. Получить координаты первой точки не попавшей в эту область (фигура...

ostream &operator<< (ostream &output, const Array &obj) - что означает эта строка?
void Array::getArray() // вывод массива { for (int ix = 0; ix &lt; size; ix++) cout &lt;&lt; setw(5) &lt;&lt; ptr; // вывод элементов...

Порядок вычисления: операторы «|» и «||», «&» и «&&»
В Java булевые операторы «|» и «||», и «&amp;» и «&amp;&amp;» отличаются друг от друга порядком вычеслений, а в C++ так же как и в Java или...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru