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

Подскажите в чем разница - C++

Восстановить пароль Регистрация
 
sievmi
2 / 2 / 0
Регистрация: 20.06.2012
Сообщений: 73
24.06.2012, 15:25     Подскажите в чем разница #1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <fstream>
#include <cmath>
using namespace std;
 
int main()
{
    ifstream x("INPUT.TXT");
    ofstream d("OUTPUT.TXT");
 
    int y, n;
 
    x >> n;
    y = pow(2, n);
 
    d << (y-n-1);
}
Этот код проходит все тесты.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <fstream>
#include <cmath>
using namespace std;
 
int main()
{
    ifstream x("INPUT.TXT");
    ofstream d("OUTPUT.TXT");
 
    int  n;
 
    x >> n;
 
    d << (pow(2, n)-n-1);
}
А этот код дает WA на одном из тестов.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.06.2012, 15:25     Подскажите в чем разница
Посмотрите здесь:

C++ В чем разница.
В чем разница? C++
C++ в чем разница?
C++ В чем разница
В чем разница между С и С++ C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Invader_Zim
Twilight Parasite
 Аватар для Invader_Zim
153 / 149 / 2
Регистрация: 21.07.2011
Сообщений: 907
24.06.2012, 15:26     Подскажите в чем разница #2
sievmi, Так надо)
sievmi
2 / 2 / 0
Регистрация: 20.06.2012
Сообщений: 73
24.06.2012, 15:28  [ТС]     Подскажите в чем разница #3
Цитата Сообщение от Invader_Zim Посмотреть сообщение
sievmi, Так надо)
Но все же в чем разница их работы ?
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
24.06.2012, 15:32     Подскажите в чем разница #4
В первом случае результат получается типа int, во втором типа double. При выводе большого значения double выводится в научном формате: 2.14748e+09
А вообще pow(2, n) правильнее было бы заменить на
C++
1
(1 << n)
sievmi
2 / 2 / 0
Регистрация: 20.06.2012
Сообщений: 73
24.06.2012, 15:43  [ТС]     Подскажите в чем разница #5
Цитата Сообщение от grizlik78 Посмотреть сообщение
А вообще pow(2, n) правильнее было бы заменить на
C++
1
(1 << n)
Спасибо, все работает, но есть пара вопросов.
Я в C++ новичок совсем и что-то не понял как работает ваша инструкция(но работает она отлично ),
насколько я знаю "<<" это оператор вывода и это меня совсем сбило.
И еще вопрос, почему ее лучше использовать чем pow(2, n) ?
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
24.06.2012, 15:59     Подскажите в чем разница #6
Изначально, ещё в Си, оператор << означал битовый сдвиг числа влево. То есть (a << 3) означает, что битовое представление числа a надо сдвинуть влево на 3 разряда (правые заполняются нулями). Сдвиг на один разряд влево эквивалентен умножению на 2. Сдвиг на n разрядов эквивалентен n-кратному умножению на 2, или умножению на 2 в степени n.
Это уже потом, в C++, этот оператор был переопределён для потоков как операция вывода.
Цитата Сообщение от sievmi Посмотреть сообщение
И еще вопрос, почему ее лучше использовать чем pow(2, n) ?
Если результат укладывается в целочисленный тип, то это быстрее, чем функция pow(). Если же результат не умещается в целочисленной переменной, то тогда выбора нет, придётся использовать pow(), которая выдаёт результат типа double.

Добавлено через 8 минут
Пожалуй поясню ещё такую строку:
C++
1
d << (1 << n)-n-1;
Здесь второй << является оператором сдвига, а первый оператором вывода в поток. Отличаются они в данном случае левым операндом. У первого оператора слева стоит объект потока вывода, а у второго слева и справа значения целочисленного типа. Вот именно по разным типам операндов эти операторы и различаются компилятором. Это называется перегрузка функций.
sievmi
2 / 2 / 0
Регистрация: 20.06.2012
Сообщений: 73
24.06.2012, 16:02  [ТС]     Подскажите в чем разница #7
Цитата Сообщение от grizlik78 Посмотреть сообщение
Изначально, ещё в Си, оператор << означал битовый сдвиг числа влево. То есть (a << 3) означает, что битовое представление числа a надо сдвинуть влево на 3 разряда (правые заполняются нулями).
Тоесть если я перед оператором << напишу число, то он работает уже как оператор битового сдвига, а не оператор вывода?
Получается если << сдвигает влево, то >> вправо ?

И еще вопрос : Почему (1 << n ) нужно обязательно в скобки заключать? Без них ошибка при компиляции.

Добавлено через 1 минуту
Цитата Сообщение от grizlik78 Посмотреть сообщение
Здесь второй << является оператором сдвига, а первый оператором вывода в поток. Отличаются они в данном случае левым операндом. У первого оператора слева стоит объект потока вывода, а у второго слева и справа значения целочисленного типа. Вот именно по разным типам операндов эти операторы и различаются компилятором. Это называется перегрузка функций.
Извиняюсь, пока ответ на ваш прошлый пост писал не заметил нового )
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
24.06.2012, 16:05     Подскажите в чем разница #8
Цитата Сообщение от sievmi Посмотреть сообщение
Получается если << сдвигает влево, то >> вправо ?
Да.
Цитата Сообщение от sievmi Посмотреть сообщение
И еще вопрос : Почему (1 << n ) нужно обязательно в скобки заключать? Без них ошибка при компиляции.
А как выглядит строка кода с ошибкой?
sievmi
2 / 2 / 0
Регистрация: 20.06.2012
Сообщений: 73
24.06.2012, 16:09  [ТС]     Подскажите в чем разница #9
Поторопился написать, не ошибка а предупреждение, но все же.

Строка вот:
C++
1
d << (1<<n-n-1);
А сообщение компилятора вот:
warning: left shift count is negative
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
24.06.2012, 16:12     Подскажите в чем разница #10
У оператора << приоритет меньше, чем у арифметических, сначала выполняется вычитание, потом сдвиг.
Получается недопустимое выражение (1 << -1), компилятор это заметил и известил.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.06.2012, 06:50     Подскажите в чем разница
Еще ссылки по теме:

В чем разница C++
C++ В чем разница?
C++ В чем разница между X x; и X x()?

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

Или воспользуйтесь поиском по форуму:
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
25.06.2012, 06:50     Подскажите в чем разница #11
Цитата Сообщение от sievmi Посмотреть сообщение
Тоесть если я перед оператором << напишу число, то он работает уже как оператор битового сдвига, а не оператор вывода?
Более того, и в С++ этот оператор остался оператором побитового сдвига. Просто для класса std::ostream оператор сдвига влево << перегружен для получения другого эффекта. Но оператор этот (с технической точки зрения) нельзя назвать оператором вывода. С пользовательской точки зрения - можно.
Yandex
Объявления
25.06.2012, 06:50     Подскажите в чем разница
Ответ Создать тему
Опции темы

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