2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу 1, 2  След.
 
 Изменяется ли аргумент выражения
Сообщение11.05.2017, 12:07 


07/10/15

2400
Здравствуйте
возник следующий вопрос: после выполнения следующего кода (синтаксис языка С)
Код:
int Siz=fPoz>>3;


изменится ли переменная fPoz, или же она останется такой как и была?

 Профиль  
                  
 
 Re: Изменяется ли аргумент выражения
Сообщение11.05.2017, 12:17 


11/12/14
893
Не изменится.

 Профиль  
                  
 
 Re: Изменяется ли аргумент выражения
Сообщение11.05.2017, 12:23 


07/10/15

2400
а если
Код:
int a=++b;

то b тоже не изменится?

 Профиль  
                  
 
 Re: Изменяется ли аргумент выражения
Сообщение11.05.2017, 12:29 
Заслуженный участник


20/08/14
11151
Россия, Москва
Andrey_Kireew в сообщении #1215684 писал(а):
Код:
int Siz=fPoz>>3;
Обычно - не изменится. Но можно придумать редкие исключения когда изменится. Не уверен что они сработают в стандартном языке С, но уж в С++ точно можно.
Потому если есть сомнения - проверьте, сохраните предварительно переменную fPoz куда-то ещё и сравните её значение до и после.

Andrey_Kireew в сообщении #1215689 писал(а):
Код:
int a=++b;
А тут - изменится. И в a запишется уже новое значение b. Снова про исключения напоминать не буду.

 Профиль  
                  
 
 Re: Изменяется ли аргумент выражения
Сообщение11.05.2017, 12:36 


07/10/15

2400
Спасибо!
Проверить то проверил, но не факт что везде будет работать так как у меня сейчас. Спрашиваю, чтобы избежать глупых ошибок, которые потом будет трудно обнаружить.

 Профиль  
                  
 
 Re: Изменяется ли аргумент выражения
Сообщение11.05.2017, 12:47 
Заслуженный участник


20/08/14
11151
Россия, Москва

(Оффтоп)

Я бы рекомендовал в таких случаях не проверять живьём, а читать учебники и стандарты (на операции), но понимаю что это никому не нужный идеализм ...

 Профиль  
                  
 
 Re: Изменяется ли аргумент выражения
Сообщение11.05.2017, 13:04 
Заслуженный участник
Аватара пользователя


16/07/14
8449
Цюрих
Andrey_Kireew, посмотрите стандарт. Там прописано, как ведут себя в таких ситуациях встроенные типы (а определенные пользователем всё равно могут работать как угодно).
При работе с C или C++ нужно помнить, что бывают 4 уровня определенности: standard defined (в стандарте четко прописано, что происходит), implementation defined (в описании компилятора должно быть четко прописано, что происходит), unspecified (код может делать разное в зависимости от погоды на Марсе) и undefined (код может делать что угодно - например, $x = x++$ в соответствии со стандартом имеет полное право отформатировать диск). И понять, гарантируется ли данное поведение, или просто звезды сошлись, можно единственным способом - посмотреть, что про него написано в стандарте.
(или, очевидно, спросить у тех, кто знает, что написано в стандарте - но лучше уметь читать его самостоятельно; он не страшный и почти не кусается)

(занудство про перегрузку)

Dmitriy40 в сообщении #1215693 писал(а):
Потому если есть сомнения - проверьте, сохраните предварительно переменную fPoz куда-то ещё и сравните её значение до и после.
Вообще говоря, сохранение и/или проверка равенства тоже могут быть устроены странно - так что значение изменится, но совпадет с сохраненным.

 Профиль  
                  
 
 Re: Изменяется ли аргумент выражения
Сообщение12.05.2017, 10:43 
Заслуженный участник
Аватара пользователя


30/01/06
72407
Вопрос уровня не Стандарта, а начального учебника.

 Профиль  
                  
 
 Re: Изменяется ли аргумент выражения
Сообщение13.05.2017, 06:18 


07/10/15

2400
Цитата:
Вопрос уровня не Стандарта, а начального учебника


... вот по этому и задал, в надежде на быстрый ответ, т.к. сам не являюсь профессиональным программистом.
Раньше я хотел сделать так

Код:
int Siz=fPoz; Siz>>3;


вопросов бы не было, но унарный сдвиг почему то не работает, компилятор выдаёт ошибку.

Зато код
Код:
int Siz=fPoz>>3;


работает правильно, fPoz не изменяется.
Хотя уверенности в том что так будет всегда и везде у меня нет.
Будет время - почитаю литературу ...

 Профиль  
                  
 
 Re: Изменяется ли аргумент выражения
Сообщение13.05.2017, 10:41 
Заслуженный участник


02/08/11
6892
Andrey_Kireew в сообщении #1216102 писал(а):
компилятор выдаёт ошибку
Не ошибку, а предупреждение, которое нужно прочитать и понять.

 Профиль  
                  
 
 Re: Изменяется ли аргумент выражения
Сообщение13.05.2017, 13:09 
Заслуженный участник


20/08/14
11151
Россия, Москва
Andrey_Kireew в сообщении #1216102 писал(а):
но унарный сдвиг почему то не работает,
Как не работают и унарный плюс и минус и умножение и деление:
Код:
a+;
b-;
c*;
d/;
Удивительно, да? :facepalm:

 Профиль  
                  
 
 Re: Изменяется ли аргумент выражения
Сообщение13.05.2017, 14:46 


07/10/15

2400
вообще то унарный минус
Код:
-a;

он меняет знак
есть и унарный плюс
Код:
+a;

используется реже, для сохранения порядка вычислений.

Так что Вам Dmitriy40 не мешало бы самому сначала разобраться, а потом уже писать комментарии

-- 13.05.2017, 15:49 --

Цитата:
Не ошибку, а предупреждение, которое нужно прочитать и понять

Я бы с удовольствием прочитал, но у меня там одни "крокозябры" в сообщениях, только номер строки с ошибкой могу разобрать,
сейчас пытаюсь это исправить - пока безуспешно

 Профиль  
                  
 
 Re: Изменяется ли аргумент выражения
Сообщение13.05.2017, 14:55 
Заслуженный участник


20/08/14
11151
Россия, Москва
Andrey_Kireew
Ладно, такой пример будет более понятным?
Код:
a+3;
b-5;
c*9;
d/7;
Ни одно из этих выражений не меняет значение переменных, т.е. "не работает" в Ваших терминах. Точно как и "унарный >>". Именно об этом я и хотел сказать. И кстати термин "унарный" тут неправомерен, на чём я и попался, унарного сдвига вообще не бывает. И унарный минус (как и унарный плюс), значение переменной тоже не меняет.

 Профиль  
                  
 
 Re: Изменяется ли аргумент выражения
Сообщение13.05.2017, 15:16 


07/10/15

2400
Такой код пишется так
Код:
a+=3;
b-=5;
c*=9;
d/=7;


но действительно
Код:
Siz>>3;

не правильный, тут необходимо присваивание, нужно писать
Код:
Siz>>=3;


тогда ответ на мой исходный вопрос очевиден - аргумент fPoz не изменяется
теперь всё понятно

 Профиль  
                  
 
 Re: Изменяется ли аргумент выражения
Сообщение13.05.2017, 16:45 
Заслуженный участник
Аватара пользователя


16/07/14
8449
Цюрих
Andrey_Kireew в сообщении #1216147 писал(а):
Такой код пишется так
Нет, код, который написал Dmitriy40 пишется так, как он написал (по определению), вы написали уже другой код (и в общем случае бинарный + и += никак не связаны).

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 20 ]  На страницу 1, 2  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group