1 / 1 / 0
Регистрация: 15.04.2013
Сообщений: 29
1

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

25.01.2014, 00:37. Показов 1723. Ответов 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/c... precedence, оператор префиксный инкремент и декремент стоит на 3 позиции, а сложение и вычитание на 6 тогда условный оператор давал бы true, но он дает false, я так понимаю это связано с ассоциативностью, как она влияет на таблицу, что означает слева-направо справа-налево, как правильно пользоваться таблицей?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.01.2014, 00:37
Ответы с готовыми решениями:

Вывод статистики по приоритетам
Если не вдаваться в подробности, то задача сводится к следующей. Генерируются 150 транзактов с...

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

Разъяснение
Ребят, может кто-то сможет объяснить новичку в данном языке программирования, что требуется сделать...

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

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

Цитата Сообщение от programmer92ua Посмотреть сообщение
что означает слева-направо справа-налево
Слева направо значит, что все операции, согласно их приоритету, выполняются слева направо
Справа налево - с точностью до наоборот
1
Форумчанин
Эксперт CЭксперт С++
8194 / 5044 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
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
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
4023 / 3280 / 920
Регистрация: 25.03.2012
Сообщений: 12,269
Записей в блоге: 1
25.01.2014, 01:04 5
В твоём примере b++ будет возвращать 1, т.е. 2<=1-0 false
0
1 / 1 / 0
Регистрация: 15.04.2013
Сообщений: 29
25.01.2014, 01:08  [ТС] 6
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
В твоём примере b++ будет возвращать 1, т.е. 2<=1-0 false
Так я логично и задаю вопрос, почему операция постфиксный инкремент выполняется после операции вычитание, если его приоритет выше?
0
Форумчанин
Эксперт CЭксперт С++
8194 / 5044 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
25.01.2014, 01:11 7
programmer92ua, инкремент выполняется уже после проверки условия. Мое сообщение выше по поводу значений на момент проверки неверно
На момент проверки в a = 2, b = 1, c = 0. Сразу после проверки значение b увеличивается на единицу.
Кстати, для префиксного инкремента условие бы выполнилось.

Добавлено через 59 секунд
То есть постфиксные операции выполняются по выходу из логического блока или же до завершения инструкции.
0
382 / 280 / 31
Регистрация: 04.09.2009
Сообщений: 1,225
25.01.2014, 01:14 8
Цитата Сообщение от programmer92ua Посмотреть сообщение
почему операция постфиксный инкремент выполняется после операции вычитание, если его приоритет выше?
Высокий Приоритет постфиксного инкремента будет играть роль, возможно, в каких-нибудь экзотических конструкциях, состоящих из множества унарных операций, коим и является этот ваш инкремент.
В вашем случае такое поведение обусловлено самой природой этого оператора - он увеличивает значение переменной только после того, как оно употребилось в контексте какой-то операци.
1
1 / 1 / 0
Регистрация: 15.04.2013
Сообщений: 29
25.01.2014, 01:17  [ТС] 9
Цитата Сообщение от MrGluck Посмотреть сообщение
programmer92ua, инкремент выполняется уже после проверки условия. Мое сообщение выше по поводу значений на момент проверки неверно
На момент проверки в a = 2, b = 1, c = 0. Сразу после проверки значение b увеличивается на единицу.
Кстати, для префиксного инкремента условие бы выполнилось.
Вот вот, я тоже понял что неверно, для префиксного инкремента я согласен выполняется, потому что я смотрю таблицу и вижу что он стоит на 3. Но почему? если постфиксные операции стоят еще выше по приоритету?
0
Форумчанин
Эксперт CЭксперт С++
8194 / 5044 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
25.01.2014, 01:19 10
Цитата Сообщение от programmer92ua Посмотреть сообщение
Но почему? если постфиксные операции стоят еще выше по приоритету?
Цитата Сообщение от MrGluck Посмотреть сообщение
постфиксные операции выполняются по выходу из логического блока или же до завершения инструкции.
вот поэтому. Такова их природа. Могу поискать отсылку этому в стандарте, если очень надо (мне лень)
0
Неэпический
17815 / 10586 / 2044
Регистрация: 27.09.2012
Сообщений: 26,631
Записей в блоге: 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
1 / 1 / 0
Регистрация: 15.04.2013
Сообщений: 29
25.01.2014, 01:22  [ТС] 12
Цитата Сообщение от gromo Посмотреть сообщение
Высокий Приоритет постфиксного инкремента будет играть роль, возможно, в каких-нибудь экзотических конструкциях, состоящих из множества унарных операций, коим и является этот ваш инкремент.
В вашем случае такое поведение обусловлено самой природой этого оператора - он увеличивает значение переменной только после того, как оно употребилось в контексте какой-то операции.
спс за ответ, это то что я и хотел спросить, но что теперь получается, мне как программисту которому сразу тяжело понять экзотическая это ситуация или нет, а если я еще какой-то пример найду, а там будет экзотически себя вести другой оператор, то я вообще запутаюсь, тут нужно обладать опытом чтобы сразу понять, тогда данная таблица например мне, что и было доказано в примере не помогла понять почему произошло именно так. Может есть более детальная таблица которая учитывает эти экзотические моменты?
0
Неэпический
17815 / 10586 / 2044
Регистрация: 27.09.2012
Сообщений: 26,631
Записей в блоге: 1
25.01.2014, 01:24 13
Цитата Сообщение от programmer92ua Посмотреть сообщение
Может есть более детальная таблица которая учитывает эти экзотические моменты?
они описываются в любом учебнике и никакой экзотикой не являются
0
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
4023 / 3280 / 920
Регистрация: 25.03.2012
Сообщений: 12,269
Записей в блоге: 1
25.01.2014, 01:27 15
При чём тут вообще приоритет операций? Тут надо автору смотреть на отличия префиксного инкремента от постфиксного!
И приоритет далеко не главное их отличие (и в данном примере роли не играет)
0
1 / 1 / 0
Регистрация: 15.04.2013
Сообщений: 29
25.01.2014, 01:36  [ТС] 16
Цитата Сообщение от Croessmah Посмотреть сообщение
они описываются в любом учебнике и никакой экзотикой не являются
Тогда почему он не стоит на последнем месте в таблице?

Добавлено через 9 минут
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
При чём тут вообще приоритет операций? Тут надо автору смотреть на отличия префиксного инкремента от постфиксного!
И приоритет далеко не главное их отличие (и в данном примере роли не играет)
Я еще раз объясняю, я знаю разницу между ними, этот пример я составил себе сам, просто посмотрел в таблицу на приоритет он выше чем у вычитания, и подумал тогда почему он стоит выше, и задал вопрос логичный, а вы мне про то какое отличие между постфиксной и префиксной.
0
Неэпический
17815 / 10586 / 2044
Регистрация: 27.09.2012
Сообщений: 26,631
Записей в блоге: 1
25.01.2014, 01:41 17
Цитата Сообщение от programmer92ua Посмотреть сообщение
и задал вопрос логичный
вот когда поймете
Цитата Сообщение от programmer92ua Посмотреть сообщение
то какое отличие между постфиксной и префиксной.
тогда вопрос отпадет сам собой.
0
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 минут
Ахахах, меня осенило, как оператор он выполниться самый первый, просто по своей сути он изменит значение
после проверки.
0
Неэпический
17815 / 10586 / 2044
Регистрация: 27.09.2012
Сообщений: 26,631
Записей в блоге: 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 Посмотреть сообщение
постфиксный сначала возвратит потом увеличит.
0
1 / 1 / 0
Регистрация: 15.04.2013
Сообщений: 29
25.01.2014, 02:02  [ТС] 20
Цитата Сообщение от Croessmah Посмотреть сообщение
вот когда поймете

тогда вопрос отпадет сам собой.
Вот реально понимать разницу можно про разному, вот теперь я действительно понял, и мне не понятно почему Kuzia domovenok говорит причем тут приоритет, разве я не прав когда сейчас говорю что постфиксный оператор выполняется первый в моем примере и заставляет возвратить значение переменной вот что он делает, а уже потом выполняет инкремент, он выполняет 2 действия, и 1 приходится по приоритету на 2 месте, теперь правильно?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.01.2014, 02:02
Помогаю со студенческими работами здесь

Необходимо разъяснение
Товарищи, у меня есть вопрос такого плана, мне необходимо чтобы программа перехватывала нажатие...

Разъяснение новичку!
number = 23 running = True while running: guess = int(input('Введите целое число : ')) ...

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

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

требуетс разъяснение
есть проблемка. при открывании нескольких экземпляров баз на одном компьютере при обращении к одной...

Разъяснение скрипта
Всем привет! Прошу прощения, что к вам обращаюсь, но сроки очень поджимают. Есть готовый скрипт,...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru