Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
programmer92ua
1 / 1 / 0
Регистрация: 15.04.2013
Сообщений: 29
#1

Разъяснение по приоритетам операций С++ - C++

25.01.2014, 00:37. Просмотров 813. Ответов 21
Метки нет (Все метки)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
int main()
{
    int a=2;
    int b=1;
    int c=0;
 
    if ( a <= b++ - c++)
    {
        a++;
        b--;
        c +=2;
    }
 
    cout << a << " " << b << " " << c << endl;
 
 
    return 0;
}
На выходе 2 2 1

Здравствуйте! Вот смотрю я в таблицу http://ru.cppreference.com/w/cpp/language/operator_precedence, оператор префиксный инкремент и декремент стоит на 3 позиции, а сложение и вычитание на 6 тогда условный оператор давал бы true, но он дает false, я так понимаю это связано с ассоциативностью, как она влияет на таблицу, что означает слева-направо справа-налево, как правильно пользоваться таблицей?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.01.2014, 00:37
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Разъяснение по приоритетам операций С++ (C++):

Разъяснение float f = 1.2F; - C++
Вчера читал статью про C++ и встретил код, написанный следующим методом float f = 1.2F; и пришел в замешательство. Переменная f...

Разъяснение кода - C++
Доброго времени суток, такая проблема, надеюсь поможете безвозмездно. Имеется программа &quot;шифрования&quot; Хочется чтобы спецы объяснили сам...

Разъяснение по коду - C++
Здравствуйте уважаемые киберфорумцы! Имеется вот такой код программы #include &lt;cmath&gt; #include &lt;iostream&gt; #include...

Разъяснение работы цикла while() - C++
Всем добрый день. Я начинающий программист, да и к тому же учусь на Java. А тут попался код, на С++, но в нем есть некоторые моенты,...

Разъяснение алгоритмов задачи о рюкзаке для новичков - C++
Есть несколько алгоритмов решения задачи о рюкзаке. Не могли бы вы написать комментарии к ним объясняющие какая процедура для чего нужна?...

Вставить между цифрами 1, 2,..., 8, 9 в данном порядке, знак одной из 4-х арифметических операций так, чтобы результат восьми послед-х операций =100 - C++
Вычисления проводятся слева-направо, ни одна операция не имеет приоритета. Добавлено через 2 минуты задача вынесла моск, прошу помочь

21
gromo
372 / 271 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
25.01.2014, 00:43 #2
Цитата Сообщение от programmer92ua Посмотреть сообщение
оператор префиксный инкремент и декремент стоит на 3 позиции,
К слову, в вашем коде нет ни одного префиксного инкремента/декремента

Цитата Сообщение от programmer92ua Посмотреть сообщение
что означает слева-направо справа-налево
Слева направо значит, что все операции, согласно их приоритету, выполняются слева направо
Справа налево - с точностью до наоборот
1
MrGluck
Модератор
Эксперт CЭксперт С++
7524 / 4662 / 703
Регистрация: 29.11.2010
Сообщений: 12,733
25.01.2014, 00:45 #3
А проверка <= стоит на 8.
9 строка равносильна:
C++
1
if ( a <= ((b++) - (c++)))
условие не выполняется, зато b и c инкремируются. Итого 2 2 1

Добавлено через 1 минуту
на момент проверки a = 2, b = 2, c = 1.
2 <= 2-1 <==> 2 <= 1
Ложь.
1
programmer92ua
1 / 1 / 0
Регистрация: 15.04.2013
Сообщений: 29
25.01.2014, 01:00  [ТС] #4
Цитата Сообщение от MrGluck Посмотреть сообщение
А проверка <= стоит на 8.
9 строка равносильна:
C++
1
if ( a <= ((b++) - (c++)))
условие не выполняется, зато b и c инкремируются. Итого 2 2 1

Добавлено через 1 минуту
на момент проверки a = 2, b = 2, c = 1.
2 <= 2-1 <==> 2 <= 1
Ложь.
Ок тогда так

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
using namespace std;
int main()
{
    int a=2;
    int b=1;
    int c=0;
 
    if ( a <= b++ - c)
    {
        a++;
        b--;
        c +=2;
    }
 
    cout << a << " " << b << " " << c << endl;
 
 
    return 0;
}
на момент проверки a = 2, b = 2, c = 0.
2 <= 2-0 <==> 2 <= 2
True.

На выходе 2 2 0, а должно быть 3 1 2

Добавлено через 5 минут
gromo, Простите перепутал
0
Kuzia domovenok
2119 / 1949 / 192
Регистрация: 25.03.2012
Сообщений: 6,755
Записей в блоге: 1
25.01.2014, 01:04 #5
В твоём примере b++ будет возвращать 1, т.е. 2<=1-0 false
0
programmer92ua
1 / 1 / 0
Регистрация: 15.04.2013
Сообщений: 29
25.01.2014, 01:08  [ТС] #6
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
В твоём примере b++ будет возвращать 1, т.е. 2<=1-0 false
Так я логично и задаю вопрос, почему операция постфиксный инкремент выполняется после операции вычитание, если его приоритет выше?
0
MrGluck
Модератор
Эксперт CЭксперт С++
7524 / 4662 / 703
Регистрация: 29.11.2010
Сообщений: 12,733
25.01.2014, 01:11 #7
programmer92ua, инкремент выполняется уже после проверки условия. Мое сообщение выше по поводу значений на момент проверки неверно
На момент проверки в a = 2, b = 1, c = 0. Сразу после проверки значение b увеличивается на единицу.
Кстати, для префиксного инкремента условие бы выполнилось.

Добавлено через 59 секунд
То есть постфиксные операции выполняются по выходу из логического блока или же до завершения инструкции.
0
gromo
372 / 271 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
25.01.2014, 01:14 #8
Цитата Сообщение от programmer92ua Посмотреть сообщение
почему операция постфиксный инкремент выполняется после операции вычитание, если его приоритет выше?
Высокий Приоритет постфиксного инкремента будет играть роль, возможно, в каких-нибудь экзотических конструкциях, состоящих из множества унарных операций, коим и является этот ваш инкремент.
В вашем случае такое поведение обусловлено самой природой этого оператора - он увеличивает значение переменной только после того, как оно употребилось в контексте какой-то операци.
1
programmer92ua
1 / 1 / 0
Регистрация: 15.04.2013
Сообщений: 29
25.01.2014, 01:17  [ТС] #9
Цитата Сообщение от MrGluck Посмотреть сообщение
programmer92ua, инкремент выполняется уже после проверки условия. Мое сообщение выше по поводу значений на момент проверки неверно
На момент проверки в a = 2, b = 1, c = 0. Сразу после проверки значение b увеличивается на единицу.
Кстати, для префиксного инкремента условие бы выполнилось.
Вот вот, я тоже понял что неверно, для префиксного инкремента я согласен выполняется, потому что я смотрю таблицу и вижу что он стоит на 3. Но почему? если постфиксные операции стоят еще выше по приоритету?
0
MrGluck
Модератор
Эксперт CЭксперт С++
7524 / 4662 / 703
Регистрация: 29.11.2010
Сообщений: 12,733
25.01.2014, 01:19 #10
Цитата Сообщение от programmer92ua Посмотреть сообщение
Но почему? если постфиксные операции стоят еще выше по приоритету?
Цитата Сообщение от MrGluck Посмотреть сообщение
постфиксные операции выполняются по выходу из логического блока или же до завершения инструкции.
вот поэтому. Такова их природа. Могу поискать отсылку этому в стандарте, если очень надо (мне лень)
0
Croessmah
Пришел
Эксперт CЭксперт С++
13738 / 7818 / 891
Регистрация: 27.09.2012
Сообщений: 19,213
Записей в блоге: 3
Завершенные тесты: 1
25.01.2014, 01:21 #11
Цитата Сообщение от programmer92ua Посмотреть сообщение
Но почему? если постфиксные операции стоят еще выше по приоритету?
потому что префиксные сначала инкреминируют, а потом возвращают значение.
Постфиксные - сначала возвращают значение, а потом инкреминируют.
префиксные:
C++
1
2
3
4
5
int a = 0 ;
int b ;
//b = ++a ;
a = a + 1 ;
b = a ;
постфиксные:
C++
1
2
3
4
5
int a = 0 ;
int b ;
// b = a++ ;
b = a ;
a = a + 1 ;
1
programmer92ua
1 / 1 / 0
Регистрация: 15.04.2013
Сообщений: 29
25.01.2014, 01:22  [ТС] #12
Цитата Сообщение от gromo Посмотреть сообщение
Высокий Приоритет постфиксного инкремента будет играть роль, возможно, в каких-нибудь экзотических конструкциях, состоящих из множества унарных операций, коим и является этот ваш инкремент.
В вашем случае такое поведение обусловлено самой природой этого оператора - он увеличивает значение переменной только после того, как оно употребилось в контексте какой-то операции.
спс за ответ, это то что я и хотел спросить, но что теперь получается, мне как программисту которому сразу тяжело понять экзотическая это ситуация или нет, а если я еще какой-то пример найду, а там будет экзотически себя вести другой оператор, то я вообще запутаюсь, тут нужно обладать опытом чтобы сразу понять, тогда данная таблица например мне, что и было доказано в примере не помогла понять почему произошло именно так. Может есть более детальная таблица которая учитывает эти экзотические моменты?
0
Croessmah
Пришел
Эксперт CЭксперт С++
13738 / 7818 / 891
Регистрация: 27.09.2012
Сообщений: 19,213
Записей в блоге: 3
Завершенные тесты: 1
25.01.2014, 01:24 #13
Цитата Сообщение от programmer92ua Посмотреть сообщение
Может есть более детальная таблица которая учитывает эти экзотические моменты?
они описываются в любом учебнике и никакой экзотикой не являются
0
programmer92ua
1 / 1 / 0
Регистрация: 15.04.2013
Сообщений: 29
25.01.2014, 01:24  [ТС] #14
Цитата Сообщение от Croessmah Посмотреть сообщение
потому что префиксные сначала инкреминируют, а потом возвращают значение.
Постфиксные - сначала возвращают значение, а потом инкреминируют.
префиксные:
C++
1
2
3
4
5
int a = 0 ;
int b ;
//b = ++a ;
a = a + 1 ;
b = a ;
постфиксные:
C++
1
2
3
4
5
int a = 0 ;
int b ;
// b = a++ ;
b = a ;
a = a + 1 ;
да я понимаю как они работаю и в чем разница между ними, просто суть вопроса в другом я отписал выше.
0
Kuzia domovenok
2119 / 1949 / 192
Регистрация: 25.03.2012
Сообщений: 6,755
Записей в блоге: 1
25.01.2014, 01:27 #15
При чём тут вообще приоритет операций? Тут надо автору смотреть на отличия префиксного инкремента от постфиксного!
И приоритет далеко не главное их отличие (и в данном примере роли не играет)
0
25.01.2014, 01:27
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.01.2014, 01:27
Привет! Вот еще темы с ответами:

Задача (разъяснение) в алгоритм (программа, используя базовый и производный классы, создавала массив объектов типа производного класса) - C++
Задача на наследование классов, базовый класс - &quot;люди&quot;, производный - &quot;студенты&quot;...как я понял, а базовом надо создать символьную матрицу в...

Вывод статистики по приоритетам - GPSS
Если не вдаваться в подробности, то задача сводится к следующей. Генерируются 150 транзактов с интервалом времени 5 ± 3 . Из них 40%...

Клиент-сервер. Как расставить клиентов по приоритетам? - C#
есть Class server и много клиентов, функция типа void посылает string message. Как раставить клиентов по приоритетам? Заранее благодарен.

Разъяснение по ТЗ - PHP
Доброго времени суток, суть вопроса состоит в том что бы вы помогли мне разобраться с данным ТЗ. Что вам не ясно в данном ТЗ и какой...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru