Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
Chudakulli
1 / 1 / 1
Регистрация: 16.02.2013
Сообщений: 57
1

Код не работает так, как хотелось бы

08.05.2013, 19:56. Просмотров 726. Ответов 15
Метки нет (Все метки)

В книге есть задача с кодом:
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
27
28
29
30
31
32
33
34
35
#include "stdafx.h"
#include <iostream>
using namespace std;
 
int main()
{
    setlocale (0, "");
    int i=10;
 
    if(++i == i++) cout<<"числа равны\n";
    else cout<<"числа не равны\n";
 
    if(i++ == ++i) cout<<"числа равны\n";
    else cout<<"числа не равны\n";
 
    if(++i == ++i) cout<<"числа равны\n";
    else cout<<"числа не равны\n";
 
    if(i++ == i++) cout<<"числа равны\n";
    else cout<<"числа не равны\n";
 
    if(i++ == --i) cout<<"числа равны\n";
    else cout<<"числа не равны\n";
 
    if(i++ == i--) cout<<"числа равны\n";
    else cout<<"числа не равны\n";
 
    if(i-- == ++i) cout<<"числа равны\n";
    else cout<<"числа не равны\n";
 
    if(i-- == i++) cout<<"числа равны\n";
    else cout<<"числа не равны\n";
 
    return 0;
}
В результате выводит, что каждый раз числа равны. С ответом в книге не сходится. В чем может быть причина?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.05.2013, 19:56
Ответы с готовыми решениями:

Функция работает не так как хотелось бы(
хочу попробовать сделать калькульятор на JS . При нажатии на кнопку '1' вызывается функция push() ,...

Setprecision работает не так как хотелось бы
Как я понимаю функция setprecision определяет сколько знаков после точки должно выводиться. Но на...

Программа работает неправильно (не так, как хотелось бы)
Здравствуйте! Есть задача: &quot;Определите, можно ли вычеркнуть из данного массива одно число так,...

Помогите со скриптом на PHP. Он работает, но не так как хотелось бы
Помогите со скриптом на PHP. Он работает,но не так как хотелось бы. Я только учусь PHP. Вот...

15
edw1n
7 / 7 / 2
Регистрация: 12.11.2012
Сообщений: 114
08.05.2013, 20:01 2
Chudakulli, Правильно оформите сообщение. На панели есть специальная кнопочка для того чтобы прикрепить код C++ нужно соответственно нажать на кнопку C++.

Числа равны:
C++
1
2
3
4
5
6
7
8
9
10
11
if(++i == i++) cout<<"числа равны\n";
else cout<<"числа не равны\n";
 
if(i++ == ++i) cout<<"числа равны\n";
else cout<<"числа не равны\n";
 
if(++i == ++i) cout<<"числа равны\n";
else cout<<"числа не равны\n";
 
if(i++ == i++) cout<<"числа равны\n";
else cout<<"числа не равны\n";
Здесь сравнивается 11 и 11.

Числа не равны:
C++
1
2
3
4
5
6
7
8
9
10
11
if(i++ == --i) cout<<"числа равны\n";
else cout<<"числа не равны\n";
 
if(i++ == i--) cout<<"числа равны\n";
else cout<<"числа не равны\n";
 
if(i-- == ++i) cout<<"числа равны\n";
else cout<<"числа не равны\n";
 
if(i-- == i++) cout<<"числа равны\n";
else cout<<"числа не равны\n";
Здесь сравнивается либо 9 и 11, либо наоборот - 11 и 9.
0
Chudakulli
1 / 1 / 1
Регистрация: 16.02.2013
Сообщений: 57
08.05.2013, 20:55  [ТС] 3
Но консоль выводит, что все время числа равны
P.S.:А i там меняется от 10 до 18 за время работы программы.

Добавлено через 34 минуты
Такое чувство, что в каждом случае сначала выполняется проверка равенства, а потом уже операции инкремента и декремента. Это нормально? Странно, что в книге ответ:

равны
не равны
не равны
не равны
равны
не равны
равны
не равны
0
edw1n
7 / 7 / 2
Регистрация: 12.11.2012
Сообщений: 114
08.05.2013, 22:56 4
Цитата Сообщение от Chudakulli Посмотреть сообщение
Но консоль выводит, что все время числа равны
P.S.:А i там меняется от 10 до 18 за время работы программы.

Добавлено через 34 минуты
Такое чувство, что в каждом случае сначала выполняется проверка равенства, а потом уже операции инкремента и декремента. Это нормально? Странно, что в книге ответ:

равны
не равны
не равны
не равны
равны
не равны
равны
не равны
Читайте приоритет операций.
1-ый приоритет: ==
2-ой приоритет: ++i
3-ий приоритет: i++
Теперь можно в лоб, математически, посчитать и сказать где равно, а где нет.
0
castaway
Эксперт С++
4953 / 3059 / 456
Регистрация: 10.11.2010
Сообщений: 11,151
Записей в блоге: 10
Завершенные тесты: 1
08.05.2013, 23:00 5
Цитата Сообщение от edw1n Посмотреть сообщение
Могу сказать что сначала выполняется ++i (префиксная), нежели i++ (постфиксная) операция.
А если постфиксная стоит перед префиксной, то сначала все-равно префиксная?
0
edw1n
7 / 7 / 2
Регистрация: 12.11.2012
Сообщений: 114
08.05.2013, 23:08 6
Цитата Сообщение от lazybiz Посмотреть сообщение
А если постфиксная стоит перед префиксной, то сначала все-равно префиксная?
Суть не в том. Если над переменной есть какие-нибудь действия, то при префиксной форме, сначала срабатывает инкремент/декремент (в нашем случае), а потом уже операции над увеличенной/уменьшенной переменной.
В случае с постфиксной формой, сначала проводятся операции над переменной, а потом срабатывает инкремент/декремент.
0
castaway
Эксперт С++
4953 / 3059 / 456
Регистрация: 10.11.2010
Сообщений: 11,151
Записей в блоге: 10
Завершенные тесты: 1
08.05.2013, 23:10 7
Если бы ты сразу так выразился то 5-й пост был бы не мой..
0
edw1n
7 / 7 / 2
Регистрация: 12.11.2012
Сообщений: 114
08.05.2013, 23:12 8
Цитата Сообщение от lazybiz Посмотреть сообщение
Если бы ты сразу так выразился то 5-й пост был бы не мой..
Да, спасибо, буду аккуратен.
Самому ещё много учится.
0
Chudakulli
1 / 1 / 1
Регистрация: 16.02.2013
Сообщений: 57
08.05.2013, 23:16  [ТС] 9
Самый большой вопрос для меня - это кому верить - программе на компьютере или ответу в книге. Результаты расходятся.
0
castaway
Эксперт С++
4953 / 3059 / 456
Регистрация: 10.11.2010
Сообщений: 11,151
Записей в блоге: 10
Завершенные тесты: 1
08.05.2013, 23:19 10
В книгах бывают опечатки, а результат выполнения такой простой программы вряд ли будет ошибочным.
0
Tulosba
:)
Эксперт С++
4762 / 3256 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
08.05.2013, 23:40 11
Chudakulli, может должно быть что-то такое:
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
27
28
29
30
31
32
33
34
35
#include <iostream>
using namespace std;
 
int main()
{
    setlocale (0, "");
    int i=10;
    int j=10;
 
    if(++i == j++) cout<<"числа равны\n";
    else cout<<"числа не равны\n";
 
    if(i++ == ++j) cout<<"числа равны\n";
    else cout<<"числа не равны\n";
 
    if(++i == ++j) cout<<"числа равны\n";
    else cout<<"числа не равны\n";
 
    if(i++ == j++) cout<<"числа равны\n";
    else cout<<"числа не равны\n";
 
    if(i++ == --j) cout<<"числа равны\n";
    else cout<<"числа не равны\n";
 
    if(i++ == j--) cout<<"числа равны\n";
    else cout<<"числа не равны\n";
 
    if(i-- == ++j) cout<<"числа равны\n";
    else cout<<"числа не равны\n";
 
    if(i-- == j++) cout<<"числа равны\n";
    else cout<<"числа не равны\n";
 
    return 0;
}
числа не равны
числа не равны
числа равны
числа равны
числа не равны
числа не равны
числа не равны
числа не равны
Потому что в Вашем варианте, скорее всего неопределенное поведение в силу того, что не ясно какая часть выражение в проверке равенства должна выполняется первой.
0
Chudakulli
1 / 1 / 1
Регистрация: 16.02.2013
Сообщений: 57
08.05.2013, 23:57  [ТС] 12
Таким было условие. Нужно было в уме просчитать и потом проверить, скомпилировав код. Результат в ответе совсем не такой. Неужели, книга такая дикая... Хотелось бы узнать, у кого какие результаты получаются, может у меня со средой что-то не так
0
Tulosba
:)
Эксперт С++
4762 / 3256 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
09.05.2013, 00:12 13
Chudakulli, чтобы получить ответ как в книге надо написать как-то так:
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
 
using namespace std;
 
int main()
{
    setlocale (0, "");
    int i=10;
 
    int a, b;
 
    a = ++i;
    b = i++;
    if(a == b) cout<<"числа равны\n";
    else cout<<"числа не равны\n";
 
    a = i++;
    b = ++i;
    if( a == b) cout<<"числа равны\n";
    else cout<<"числа не равны\n";
 
    a = ++i;
    b = ++i;
    if( a == b ) cout<<"числа равны\n";
    else cout<<"числа не равны\n";
 
    a = i++;
    b = i++;
    if( a == b ) cout<<"числа равны\n";
    else cout<<"числа не равны\n";
 
    a = i++;
    b = --i;
    if(a == b) cout<<"числа равны\n";
    else cout<<"числа не равны\n";
 
    a = i++;
    b = i--;
    if(a == b) cout<<"числа равны\n";
    else cout<<"числа не равны\n";
 
    a = i--;
    b = ++i;
    if(a == b) cout<<"числа равны\n";
    else cout<<"числа не равны\n";
 
    a = i--;
    b = i++;
    if(a == b) cout<<"числа равны\n";
    else cout<<"числа не равны\n";
 
    std::system( "pause" );
    return 0;
}
числа равны
числа не равны
числа не равны
числа не равны
числа равны
числа не равны
числа равны
числа не равны
1
castaway
Эксперт С++
4953 / 3059 / 456
Регистрация: 10.11.2010
Сообщений: 11,151
Записей в блоге: 10
Завершенные тесты: 1
09.05.2013, 00:52 14
Все правильно.
Везде должно быть "числа равны", т.к. приоритет операции == ниже префиксных и постфиксных ++ и --

Добавлено через 4 минуты
Т.е., например: i++ == --i будет истина, не зависимо от того какой там инкремент и декремент, т.к. сначала изменяются значения i, а уже потом происходит сравнение i == i, а оно всегда истинно.

Добавлено через 1 минуту
Для лучшего понимания сути: i++ == i и i == --i тоже истина.
1
Chudakulli
1 / 1 / 1
Регистрация: 16.02.2013
Сообщений: 57
09.05.2013, 00:52  [ТС] 15
Спасибо, друзья!!! ))) Значит, авторы что-то перемудрили )))
0
castaway
Эксперт С++
4953 / 3059 / 456
Регистрация: 10.11.2010
Сообщений: 11,151
Записей в блоге: 10
Завершенные тесты: 1
09.05.2013, 00:58 16
Цитата Сообщение от edw1n Посмотреть сообщение
Читайте приоритет операций.
1-ый приоритет: ==
2-ой приоритет: ++i
3-ий приоритет: i++
А это я не знаю вы откуда взяли. Все не так.
На самом деле:
постфиксный инкремент и декремент - 2-й приоритет (выше только первый, там только область видимости ::)
префиксный инкремент и декремент - 3-й приоритет
оператор сравнения - 9-й приоритет (самый низкий из всех этих операторов)
(число ниже - приоритет выше)
1
09.05.2013, 00:58
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.05.2013, 00:58

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

Хотелось бы узнать как работает код
#include &lt;iostream&gt; #include &lt;string.h&gt; #include &lt;stdio.h&gt; #include &lt;time.h&gt; #include &lt;conio.h&gt;...

Код выполняемый из студии с пометкой debag, работает не так как уже компилированный код
Здравствуйте, столкнулся с такой проблемой. Код выполняемый из студии с пометкой debag, работает не...

Операция сравнения пошла не так, как хотелось бы
Пользователь вводит значения, сохраняющиеся в класс Product; программа запрашивает слово для поиска...

JTree оказался не так прост как хотелось бы
Описываю происходящее: По правой кнопке на CustomTree(extends JTree) вызывается компонент...


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

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

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