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

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

Восстановить пароль Регистрация
 
 
programmer92ua
1 / 1 / 0
Регистрация: 15.04.2013
Сообщений: 29
25.01.2014, 00:37     Разъяснение по приоритетам операций С++ #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;
}
На выходе 2 2 1

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

Вставить между цифрами 1, 2,..., 8, 9 в данном порядке, знак одной из 4-х арифметических операций так, чтобы результат восьми послед-х операций =100 C++
C++ разъяснение строки C++
Разъяснение работы цикла while() C++
Задача (разъяснение) в алгоритм (программа, используя базовый и производный классы, создавала массив объектов типа производного класса) C++
C++ Разъяснение по коду
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
25.01.2014, 00:43     Разъяснение по приоритетам операций С++ #2
Цитата Сообщение от programmer92ua Посмотреть сообщение
оператор префиксный инкремент и декремент стоит на 3 позиции,
К слову, в вашем коде нет ни одного префиксного инкремента/декремента

Цитата Сообщение от programmer92ua Посмотреть сообщение
что означает слева-направо справа-налево
Слева направо значит, что все операции, согласно их приоритету, выполняются слева направо
Справа налево - с точностью до наоборот
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,405
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
Ложь.
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, Простите перепутал
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
25.01.2014, 01:04     Разъяснение по приоритетам операций С++ #5
В твоём примере b++ будет возвращать 1, т.е. 2<=1-0 false
programmer92ua
1 / 1 / 0
Регистрация: 15.04.2013
Сообщений: 29
25.01.2014, 01:08  [ТС]     Разъяснение по приоритетам операций С++ #6
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
В твоём примере b++ будет возвращать 1, т.е. 2<=1-0 false
Так я логично и задаю вопрос, почему операция постфиксный инкремент выполняется после операции вычитание, если его приоритет выше?
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,405
25.01.2014, 01:11     Разъяснение по приоритетам операций С++ #7
programmer92ua, инкремент выполняется уже после проверки условия. Мое сообщение выше по поводу значений на момент проверки неверно
На момент проверки в a = 2, b = 1, c = 0. Сразу после проверки значение b увеличивается на единицу.
Кстати, для префиксного инкремента условие бы выполнилось.

Добавлено через 59 секунд
То есть постфиксные операции выполняются по выходу из логического блока или же до завершения инструкции.
gromo
 Аватар для gromo
366 / 265 / 24
Регистрация: 04.09.2009
Сообщений: 1,214
25.01.2014, 01:14     Разъяснение по приоритетам операций С++ #8
Цитата Сообщение от programmer92ua Посмотреть сообщение
почему операция постфиксный инкремент выполняется после операции вычитание, если его приоритет выше?
Высокий Приоритет постфиксного инкремента будет играть роль, возможно, в каких-нибудь экзотических конструкциях, состоящих из множества унарных операций, коим и является этот ваш инкремент.
В вашем случае такое поведение обусловлено самой природой этого оператора - он увеличивает значение переменной только после того, как оно употребилось в контексте какой-то операци.
programmer92ua
1 / 1 / 0
Регистрация: 15.04.2013
Сообщений: 29
25.01.2014, 01:17  [ТС]     Разъяснение по приоритетам операций С++ #9
Цитата Сообщение от MrGluck Посмотреть сообщение
programmer92ua, инкремент выполняется уже после проверки условия. Мое сообщение выше по поводу значений на момент проверки неверно
На момент проверки в a = 2, b = 1, c = 0. Сразу после проверки значение b увеличивается на единицу.
Кстати, для префиксного инкремента условие бы выполнилось.
Вот вот, я тоже понял что неверно, для префиксного инкремента я согласен выполняется, потому что я смотрю таблицу и вижу что он стоит на 3. Но почему? если постфиксные операции стоят еще выше по приоритету?
MrGluck
Ворчун
Эксперт С++
 Аватар для MrGluck
4920 / 2663 / 243
Регистрация: 29.11.2010
Сообщений: 7,405
25.01.2014, 01:19     Разъяснение по приоритетам операций С++ #10
Цитата Сообщение от programmer92ua Посмотреть сообщение
Но почему? если постфиксные операции стоят еще выше по приоритету?
Цитата Сообщение от MrGluck Посмотреть сообщение
постфиксные операции выполняются по выходу из логического блока или же до завершения инструкции.
вот поэтому. Такова их природа. Могу поискать отсылку этому в стандарте, если очень надо (мне лень)
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11817 / 6796 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 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 ;
programmer92ua
1 / 1 / 0
Регистрация: 15.04.2013
Сообщений: 29
25.01.2014, 01:22  [ТС]     Разъяснение по приоритетам операций С++ #12
Цитата Сообщение от gromo Посмотреть сообщение
Высокий Приоритет постфиксного инкремента будет играть роль, возможно, в каких-нибудь экзотических конструкциях, состоящих из множества унарных операций, коим и является этот ваш инкремент.
В вашем случае такое поведение обусловлено самой природой этого оператора - он увеличивает значение переменной только после того, как оно употребилось в контексте какой-то операции.
спс за ответ, это то что я и хотел спросить, но что теперь получается, мне как программисту которому сразу тяжело понять экзотическая это ситуация или нет, а если я еще какой-то пример найду, а там будет экзотически себя вести другой оператор, то я вообще запутаюсь, тут нужно обладать опытом чтобы сразу понять, тогда данная таблица например мне, что и было доказано в примере не помогла понять почему произошло именно так. Может есть более детальная таблица которая учитывает эти экзотические моменты?
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11817 / 6796 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
25.01.2014, 01:24     Разъяснение по приоритетам операций С++ #13
Цитата Сообщение от programmer92ua Посмотреть сообщение
Может есть более детальная таблица которая учитывает эти экзотические моменты?
они описываются в любом учебнике и никакой экзотикой не являются
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 ;
да я понимаю как они работаю и в чем разница между ними, просто суть вопроса в другом я отписал выше.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
25.01.2014, 01:27     Разъяснение по приоритетам операций С++ #15
При чём тут вообще приоритет операций? Тут надо автору смотреть на отличия префиксного инкремента от постфиксного!
И приоритет далеко не главное их отличие (и в данном примере роли не играет)
programmer92ua
1 / 1 / 0
Регистрация: 15.04.2013
Сообщений: 29
25.01.2014, 01:36  [ТС]     Разъяснение по приоритетам операций С++ #16
Цитата Сообщение от Croessmah Посмотреть сообщение
они описываются в любом учебнике и никакой экзотикой не являются
Тогда почему он не стоит на последнем месте в таблице?

Добавлено через 9 минут
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
При чём тут вообще приоритет операций? Тут надо автору смотреть на отличия префиксного инкремента от постфиксного!
И приоритет далеко не главное их отличие (и в данном примере роли не играет)
Я еще раз объясняю, я знаю разницу между ними, этот пример я составил себе сам, просто посмотрел в таблицу на приоритет он выше чем у вычитания, и подумал тогда почему он стоит выше, и задал вопрос логичный, а вы мне про то какое отличие между постфиксной и префиксной.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11817 / 6796 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
25.01.2014, 01:41     Разъяснение по приоритетам операций С++ #17
Цитата Сообщение от programmer92ua Посмотреть сообщение
и задал вопрос логичный
вот когда поймете
Цитата Сообщение от programmer92ua Посмотреть сообщение
то какое отличие между постфиксной и префиксной.
тогда вопрос отпадет сам собой.
programmer92ua
1 / 1 / 0
Регистрация: 15.04.2013
Сообщений: 29
25.01.2014, 01:54  [ТС]     Разъяснение по приоритетам операций С++ #18
Цитата Сообщение от Croessmah Посмотреть сообщение
вот когда поймете

тогда вопрос отпадет сам собой.

, разница состоит в том что префиксный оператор сначала увеличит значение, а потом возвратит его, постфиксный сначала возвратит потом увеличит.
C++
1
2
int a = 3;
int b = ++a; // a=4 , b =4
C++
1
2
int a = 3;
int b = a++; // a=4 , b =3
Вопрос не отпал сам собой, вы понимаете что я спрашиваю вообще?

Добавлено через 5 минут
Ахахах, меня осенило, как оператор он выполниться самый первый, просто по своей сути он изменит значение
после проверки.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11817 / 6796 / 769
Регистрация: 27.09.2012
Сообщений: 16,867
Записей в блоге: 2
Завершенные тесты: 1
25.01.2014, 01:58     Разъяснение по приоритетам операций С++ #19
Цитата Сообщение от programmer92ua Посмотреть сообщение
вы понимаете что я спрашиваю вообще?
угу.
Цитата Сообщение от programmer92ua Посмотреть сообщение
оператор префиксный инкремент и декремент стоит на 3 позиции, а сложение и вычитание на 6 тогда условный оператор давал бы true, но он дает false
А теперь возьмите это:
Цитата Сообщение от programmer92ua Посмотреть сообщение
постфиксный сначала возвратит потом увеличит.
и пройдите по своему коду:
C++
1
2
3
4
5
6
7
8
9
10
    int a=2;
    int b=1;
    int c=0;
 
    if ( a <= b++ - c++)//a = 2 , b тут будет равно 1, c = 0. Получаем 2<=1-0, это false
    {
        a++;
        b--;
        c +=2;
    }
переписать можно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    int a=2;
    int b=1;
    int c=0;
 
 
    int temp_b = b ;
    int temp_c = c ;
    b+=1;
    c+=1;
    if ( a <= temp_b - temp_c)
    {
        a++;
        b--;
        c +=2;
    }
Добавлено через 1 минуту
Цитата Сообщение от programmer92ua Посмотреть сообщение
Ахахах, меня осенило, как оператор он выполниться самый первый, просто по своей сути он изменит значение
после проверки.
Цитата Сообщение от Croessmah Посмотреть сообщение
Постфиксные - сначала возвращают значение, а потом инкреминируют.
Цитата Сообщение от MrGluck Посмотреть сообщение
То есть постфиксные операции выполняются по выходу из логического блока или же до завершения инструкции.
Цитата Сообщение от programmer92ua Посмотреть сообщение
постфиксный сначала возвратит потом увеличит.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.01.2014, 02:02     Разъяснение по приоритетам операций С++
Еще ссылки по теме:

C++ Разъяснение кода
Перегрузка операций C++
Разъяснение float f = 1.2F; C++

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

Или воспользуйтесь поиском по форуму:
programmer92ua
1 / 1 / 0
Регистрация: 15.04.2013
Сообщений: 29
25.01.2014, 02:02  [ТС]     Разъяснение по приоритетам операций С++ #20
Цитата Сообщение от Croessmah Посмотреть сообщение
вот когда поймете

тогда вопрос отпадет сам собой.
Вот реально понимать разницу можно про разному, вот теперь я действительно понял, и мне не понятно почему Kuzia domovenok говорит причем тут приоритет, разве я не прав когда сейчас говорю что постфиксный оператор выполняется первый в моем примере и заставляет возвратить значение переменной вот что он делает, а уже потом выполняет инкремент, он выполняет 2 действия, и 1 приходится по приоритету на 2 месте, теперь правильно?
Yandex
Объявления
25.01.2014, 02:02     Разъяснение по приоритетам операций С++
Ответ Создать тему
Опции темы

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