Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вывод после исп. унарного оператора сдвига 
V
    Опции темы
n199a
Дата 23.7.2013, 16:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.11.2011

Репутация: нет
Всего: нет



Код

#include <stdio.h>
main() {
    unsigned a;
    a = 0x10;                  //двоичная система (шест. 00010000)
    printf("%d\n", a);
    
    a >> 1;                 //сдвигает на 1 бит вправо (получится в шест. 00001000
                     //а это в десятичной будет 8)
    printf("%d\n", a);
}

Почему код выше будет выводить десятичное число 16, а не 8?
Почему надо использовать присвоение (как в коде ниже) и выводить уже значение переменно b ?
Код

#include <stdio.h>
main() {
    unsigned a, b;
    a = 0x10;             //двоичная система (шест. 00010000)
    printf("%d\n", a);
    
    b = a >> 1;     //сдвигает на 1 бит вправо (получится в шест. 00001000
                 //а это в десятичной будет 8)
    printf("%d\n", b);
}

>> (<<) не изменяет значение исходной переменной, а используется как "посредник" ?
PM MAIL   Вверх
feodorv
Дата 23.7.2013, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 12
Всего: 45



Цитата(n199a @  23.7.2013,  17:39 Найти цитируемый пост)
>> (<<) не изменяет значение исходной переменной, а используется как "посредник" ? 

Нет, не изменяет, операция проводится над копией значения. Насчёт посредника - не понял...

Ну представьте себе, что любая подобная операция проводилась бы непосредственно со значением самой переменной:
Код

int a = 5;
int b = a + 10;

После a + 10 значением переменной a должно стать 15? Как и b? Смысл??? Чтобы вот так писать???
Код

int a = 5;
int b = a;
b + 10;



Цитата(n199a @  23.7.2013,  17:39 Найти цитируемый пост)
    a >> 1;                 //сдвигает на 1 бит вправо (получится в шест. 00001000

Данный оператор имеет значение, просто это значение пропадает - ничему не присваивается....


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
n199a
Дата 23.7.2013, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.11.2011

Репутация: нет
Всего: нет



Цитата(feodorv @  23.7.2013,  16:49 Найти цитируемый пост)

Нет, не изменяет, операция проводится над копией значения. Насчёт посредника - не понял...

Я не знал как выразиться. Копия - то, что я имел ввиду.
Цитата(feodorv @  23.7.2013,  16:49 Найти цитируемый пост)
Данный оператор имеет значение, просто это значение пропадает - ничему не присваивается.... 

Если записать так:
a >> 1;
b = a;
printf("b = %d", b);
то, b равно 16. Не очень понял объяснение.
Цитата(feodorv @  23.7.2013,  16:49 Найти цитируемый пост)
После a + 10 значением переменной a должно стать 15? Как и b? Смысл??? Чтобы вот так писать???

Всё, понял.
Теперь стало понятно и про:
Цитата

Если записать так:
a >> 1;
b = a;
printf("b = %d", b);
то, b равно 16. Не очень понял объяснение.

PM MAIL   Вверх
baldina
Дата 23.7.2013, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



n199a, 
Код

// вот это действительно изменяет a
a >>= 1; // a = a >> 1


в дополнение к комментариям feodorv предлагаю еще рассмотреть такую конструкцию:
Код

123 >> 1;

брюки превращаются...
PM MAIL   Вверх
n199a
Дата 23.7.2013, 17:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.11.2011

Репутация: нет
Всего: нет



Код

// вот это действительно изменяет a
a >>= 1; // a = a >> 1

Ага, понятно теперь.
Цитата(baldina @  23.7.2013,  17:02 Найти цитируемый пост)
в дополнение к комментариям feodorv предлагаю еще рассмотреть такую конструкцию:
Код

123 >> 1;




Код

#include <stdio.h>
main() {
    unsigned a, b;
    a = 123;
    b = a >> 1;
    printf("%d", b);
}


123 = 1111011
После сдвига:
0111101 = 61

baldina, я правильно понял?


Это сообщение отредактировал(а) n199a - 23.7.2013, 17:10
PM MAIL   Вверх
baldina
Дата 23.7.2013, 17:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



правильно. только я другое имел в виду: выражение 123 >> 1 выглядит естественно и понятно, однако мы не ожидаем, что изменится константа 123.

PM MAIL   Вверх
n199a
Дата 23.7.2013, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.11.2011

Репутация: нет
Всего: нет



Цитата(baldina @  23.7.2013,  17:33 Найти цитируемый пост)
123 >> 1 выглядит естественно и понятно,

В каком смысле естественно и понятно? Имеешь ввиду 123 >> 1 = 012 ?
PM MAIL   Вверх
baldina
Дата 23.7.2013, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 15
Всего: 101



в том же, что и "a + b". тут мы понимаем, что речь идет о сложении a и b, и что сами a и b не изменяются. полагаю, если букву (переменную) заменить на число (константу), неизменность операндов более очевидна.
PM MAIL   Вверх
akizelokro
Дата 23.7.2013, 17:46 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Цитата(n199a @  23.7.2013,  16:39 Найти цитируемый пост)
 a = 0x10;                  //двоичная система (шест. 00010000)


комментарий непонятен. флаг "х", кажисть, относится к шестнадцатеричной системе
и правильно выводит 16
комментарий должен иметь вид

Код

//шестнадц. система (двоичная 00010000)


Код

Почему надо использовать присвоение (как в коде ниже) и выводить уже значение переменно b ?


Не обязательно. 

Код

a >>= 1


Просто запомни, что есть базовые операторы, ну я не лихой программер, могу в терминологии и ошибиться, которые действуют на переменную, но результат их нужно хранить в другой переменной. А есть производные от базовых, например ++, +=, >>= , которые изменяют значение самой переменной.
Лови ссылочку из википедии http://ru.wikipedia.org/wiki/%D0%9E%D0%BF%..._%D0%B8_C%2B%2B

Это сообщение отредактировал(а) akizelokro - 23.7.2013, 17:55


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
n199a
Дата 23.7.2013, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 129
Регистрация: 17.11.2011

Репутация: нет
Всего: нет



Цитата(akizelokro @  23.7.2013,  17:46 Найти цитируемый пост)
комментарий непонятен. флаг "х", кажисть, относится к шестнадцатеричной системе
и правильно выводит 16

Перепутали, спасибо за исправление.
PM MAIL   Вверх
akizelokro
Дата 23.7.2013, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Странно, на старом форуме материал отредактирован, а здесь изменений не видно

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1386 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.