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

Как сдвинуть указатель на double на 4 байта? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Структура в структуре http://www.cyberforum.ru/cpp-beginners/thread638711.html
Подскажите пожалуйста! Вот для начала немного кода: struct r2 { // ... }; struct somestruct { struct r2; // ... };
C++ Как вписать в переменную текст, размер которой превышает 4096 байтов написал скрипт , который сохрянает введенный текст в файл . и я смотрю , кайдый файл 4096 байтов . как решить проблему ? #include <iostream> using namespace std; main() { FILE * fo; fo = fopen("D:\\vagaa\\pop.txt","wt"); char text; cin.getline(text, 1024); http://www.cyberforum.ru/cpp-beginners/thread638698.html
Неопределенный массив C++
Как мне задать массив в котором может быть любое количество информации. То есть изначально она не известна. Я буду из файла в этот массив заносить символы и их количество может меняться...
C++ Что использовать с указателями? 0, NULL, nullptr?
NULL в WinDef.h описан как #define NULL 0. То есть в случае использования как с указателями, так и другими переменными разницы 0. Про nullptr только час назад узнал, даёт ли он какие-либо реальные преимущества? Но, вообщем-то, главный вопрос: что использовать?
C++ Упрощение кода http://www.cyberforum.ru/cpp-beginners/thread638678.html
Можно ли как нибудь сократить или упростить код? cin>>answer; if ((answer!="y") && (answer!="n")) { while ((answer!="y") && (answer!="n")) { cout<<"Введите верное значение: "; cin>>answer; }
C++ Как создать полноценное приложение на WinApi с различными элементами (textbox.) подскажите книгу Как создать полноценное приложение на WinApi с различными элементами(checkbox, textbox, button и тд) и как обрабатывать события от них, подскажите книгу. подробнее

Показать сообщение отдельно
OhMyGodSoLong
~ Эврика! ~
1243 / 992 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
17.08.2012, 17:09
Дело в приоритетах. Приоритет у инкремента и приведения типов одинаковый, но есть ещё понятие ассоциативности. Есть левая ассоциативность и правая. От неё зависит, в каком порядке применяются операторы с одинаковым приоритетом.

Например, сложение левоассоциативно, так что выражение
a + b + c + d + e
трактуется как
((((a + b) + c) + d) + e)
то есть вычисляется слева направо.

А вот присваивание правоассоциативно, так что выражение
a = b = c = d = e = 2
трактуется как
a = (b = (c = (d = (e = 2))))
то есть присваивания идут справа налево (выражение присваивания возвращает присвоенное значение).

К правоассоциативным операторам относятся присваивания (и просто =, и всякие +=) и унарные операторы (среди них, в частности, и инкремент/декремент, а также приведение типов). Все остальные левоассоциативны.

По этой причине
(char*)p++;
трактуется как
(char*)(p++);
То есть происходит инкремент p (на размер адресуемой величины, а не char), возвращается старое значение p и именно оно уже приводится к типу char*.

Если же попробовать написать "правильные скобки":
((char*)p)++;
то оно вообще не скомпилируется из-за рассказанных причин про lvalue: теперь приведение отрабатывает первым, но приведение типов возвращает rvalue-величину, которую инкремент не может увеличить.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru