2014 dxdy logo

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

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




На страницу 1, 2  След.
 
 Изменяется ли аргумент выражения
Сообщение11.05.2017, 12:07 
Здравствуйте
возник следующий вопрос: после выполнения следующего кода (синтаксис языка С)
Код:
int Siz=fPoz>>3;


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

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

 
 
 
 Re: Изменяется ли аргумент выражения
Сообщение11.05.2017, 12:23 
а если
Код:
int a=++b;

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

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

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

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

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

(Оффтоп)

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

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

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

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

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

 
 
 
 Re: Изменяется ли аргумент выражения
Сообщение13.05.2017, 06:18 
Цитата:
Вопрос уровня не Стандарта, а начального учебника


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

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


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

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


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

 
 
 
 Re: Изменяется ли аргумент выражения
Сообщение13.05.2017, 10:41 
Andrey_Kireew в сообщении #1216102 писал(а):
компилятор выдаёт ошибку
Не ошибку, а предупреждение, которое нужно прочитать и понять.

 
 
 
 Re: Изменяется ли аргумент выражения
Сообщение13.05.2017, 13:09 
Andrey_Kireew в сообщении #1216102 писал(а):
но унарный сдвиг почему то не работает,
Как не работают и унарный плюс и минус и умножение и деление:
Код:
a+;
b-;
c*;
d/;
Удивительно, да? :facepalm:

 
 
 
 Re: Изменяется ли аргумент выражения
Сообщение13.05.2017, 14:46 
вообще то унарный минус
Код:
-a;

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

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

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

-- 13.05.2017, 15:49 --

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

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

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

 
 
 
 Re: Изменяется ли аргумент выражения
Сообщение13.05.2017, 15:16 
Такой код пишется так
Код:
a+=3;
b-=5;
c*=9;
d/=7;


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

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


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

 
 
 
 Re: Изменяется ли аргумент выражения
Сообщение13.05.2017, 16:45 
Аватара пользователя
Andrey_Kireew в сообщении #1216147 писал(а):
Такой код пишется так
Нет, код, который написал Dmitriy40 пишется так, как он написал (по определению), вы написали уже другой код (и в общем случае бинарный + и += никак не связаны).

 
 
 [ Сообщений: 20 ]  На страницу 1, 2  След.


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group