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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
Dimmak
4 / 4 / 0
Регистрация: 10.12.2012
Сообщений: 170
#1

a=*b Что это значит? - C++

26.01.2013, 15:58. Просмотров 1412. Ответов 30
Метки нет (Все метки)

Подскажите пожалуйста!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.01.2013, 15:58
Здравствуйте! Я подобрал для вас темы с ответами на вопрос a=*b Что это значит? (C++):

что это значит? - C++
в задании есть такой фрагмент if(!(num%div)) что это означает?

что это значит? - C++
Помогите, пожалуйста, разобраться в данном фрагменте программы) char* rus(const char* text) {char *bufRus=new char; ...

Что это значит? - C++
Что значит условие (!a)?В каком случае будет выполняться правда? if(!a) { // что угодно } else { // что угодно }

Что значит это условие - C++
Вот собственно код: if ( ( words = (char**)realloc(words, sizeof(char*) * (cnt + 1)) ) == NULL )

Что это значит if (x&1) ? - C++
основным вопросом есть if (x&1) что это за условия? и что это? x>>1. какая роль в коде? unsigned long long m_recursive (unsigned long...

что значит !a и a%=(c+10) и как это записать? - C++
что значит !a и a%=(c+10) и как это записать? заранее благодарен...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Kgfq
74 / 37 / 2
Регистрация: 23.09.2012
Сообщений: 408
26.01.2013, 17:47 #16
Kuzia domovenok, а лучше и проще просто не использовать инкременты в сложных кусках
Dimmak
4 / 4 / 0
Регистрация: 10.12.2012
Сообщений: 170
27.01.2013, 01:22  [ТС] #17
К примеру, зачем писать вот так:
*(p1++) = *p2;
я не понимаю
И я тоже, но дело в том, что это фрагмент кода оптимизированного FFT, и том куске кода, о котором я спрашиваю, происходит перестановка значений для последующей ( ускоренной ) обработки. Скачивал исходник с оф.сайта...
Это единственная непонятная мне часть кода.

Добавлено через 7 часов 5 минут
Цитата Сообщение от Somebody Посмотреть сообщение
Тут два оператора.
C++
1
a = (*b)
В a записывается то, что по адресу b. (Если не считать перегрузку операторов.)
Дайте пожалуйста ссылку, где можно прочитать на тему 'a=*b'. Не совсем понятно...
DaskOFF
112 / 112 / 9
Регистрация: 02.05.2012
Сообщений: 524
Записей в блоге: 1
27.01.2013, 02:06 #18
Цитата Сообщение от Dimmak Посмотреть сообщение
Дайте пожалуйста ссылку, где можно прочитать на тему 'a=*b'. Не совсем понятно...
http://ru.wikipedia.org/wiki/%D0%A3%...BD%D1%8B%D1%85)
n = *pn; /* Присвоить n то значение (5), на которое указывает pn. */
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
27.01.2013, 02:21 #19
Цитата Сообщение от Kgfq Посмотреть сообщение
Я проверял на 2х разных компиляторах одно и то же выражение,
уж не это ли
C++
1
a = a++;
Evg
Эксперт CАвтор FAQ
17624 / 5848 / 375
Регистрация: 30.03.2009
Сообщений: 16,124
Записей в блоге: 26
27.01.2013, 09:52 #20
Цитата Сообщение от Kgfq Посмотреть сообщение
Kuzia domovenok, проблема инкрементов в том, что разные компиляторы воспринимают их немного по-разному.
Я проверял на 2х разных компиляторах одно и то же выражение, оно выдавало разные результаты.
Пример в студию
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
27.01.2013, 15:50 #21
Цитата Сообщение от Evg Посмотреть сообщение
Пример в студию
А я что-то стормозил и решил, что возможно там и может быть undefined behaviour. Но сейчас совсем непонятно мне. Ведь *(p1++) = *p2; можно объяснить по обычному определению оператора постинкремента: "возвращает значение р1 до инкремента". И нет тут никакого повода думать о точках следования и возможном UB.

С другой стороны, кто скажет, в чём различие выражения x=x++; и *x++=*y; с точки зрения наличия UB???
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
27.01.2013, 16:47 #22
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
x=x++
здесь
создается копия
увеличивается
присваивается
в каком порядке это произойдет?? что присваивается копия или измененное значение?
может быть при начальном x=1
и 1 и 2

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
*x++=*y
здесь по моему нет UB
копируем значение из ячейки по адресу y в ячейку по адресу x
увеличиваем значение в ячейке по адресу x
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6447 / 3094 / 306
Регистрация: 04.12.2011
Сообщений: 8,567
Записей в блоге: 4
27.01.2013, 17:22 #23
Цитата Сообщение от ValeryS Посмотреть сообщение
здесь
создается копия
увеличивается
присваивается
По идее, должна создаваться копия и присваиваться (то есть ничего не меняется), а после инкремент. То есть:
x=x++; аналогично просто x++;
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
27.01.2013, 17:31 #24
Цитата Сообщение от IGPIGP Посмотреть сообщение
По идее, должна создаваться копия и присваиваться (то есть ничего не меняется), а после инкремент. То есть:
x=x++; аналогично просто x++;
Нет, он прав это зависит от компилятора, а вот *x++=*y не зависит, Kgfq был не прав, что разными компиляторами это воспринимается по разному.
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
27.01.2013, 17:40 #25
пример из другого форума
Это еще не самое страшное! Вот код:
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>;
using namespace std;
 
int foo (int a) { return a; }
 
void main(void) {
    int i = 1;
    i = foo ( i++ );
    cout << i << '\n';
}
Ответ должен быть 1? Выводит "1", если компилить в режиме "Debug", и "2" -- в режиме "Release".
Kuzia domovenok
1891 / 1746 / 118
Регистрация: 25.03.2012
Сообщений: 5,924
Записей в блоге: 1
27.01.2013, 17:42 #26
в том то и дело, что когда значение переменной изменяется на ходу между двумя точками следования,
ответ никому ничего не должен
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
27.01.2013, 17:43 #27
час придет Evg и все научно объяснит
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6447 / 3094 / 306
Регистрация: 04.12.2011
Сообщений: 8,567
Записей в блоге: 4
27.01.2013, 18:03 #28
Цитата Сообщение от ValeryS Посмотреть сообщение
пример из другого форума
Тут тоже понятно вроде. Инкрементированное (то есть поскольку постфиксное, то инкремент произойдёт после передачи) значение передано по значению через формальный параметр, для инициализации локальной переменной. Стало быть передана копия (она будет инкрементирована и отброшена)). Потом вернулось значение, то есть то что было до инкремента. И потом присваивание. Логично. Но читать такие вещи, особенно с указателями забавно. Это факт.

Добавлено через 8 минут
Цитата Сообщение от IGPIGP Посмотреть сообщение
Стало быть передана копия (она будет инкрементирована и отброшена)).
А скорее всего она будет отброшена ещё до инкремента, так как нигде не используется.
ValeryS
Модератор
6556 / 5022 / 464
Регистрация: 14.02.2011
Сообщений: 16,763
27.01.2013, 18:05 #29
Цитата Сообщение от IGPIGP Посмотреть сообщение
И потом присваивание. Логично.
что логично??
компилятор ведет себя по разному
Цитата Сообщение от ValeryS Посмотреть сообщение
Ответ должен быть 1? Выводит "1", если компилить в режиме "Debug", и "2" -- в режиме "Release".
я подозреваю что в Debug вызывается функция
а в Release эту функцию компилятор выкинул и получилось
C++
1
i =  i++ ;
т.е совершенно две разных логики
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6447 / 3094 / 306
Регистрация: 04.12.2011
Сообщений: 8,567
Записей в блоге: 4
27.01.2013, 18:17 #30
Цитата Сообщение от ValeryS Посмотреть сообщение
что логично??
компилятор ведет себя по разному
я подозреваю что в Debug вызывается функция
а в Release эту функцию компилятор выкинул и получилось
C++
1
i =  i++ ;
т.е совершенно две разных логики
! Вот это да! Получается, действительно, неоднозначно. Еще один аргумент трижды подумать, прежде чем решиться...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.01.2013, 18:17
Привет! Вот еще темы с ответами:

Не могу понять, что это значит: while(i<10/2) - C++
/*обращение массива*/ #include &lt;stdio.h&gt; main() { int p,i=0; static a={10,11,12,13,14, 15,16,17,18,19}; while(i&lt;10/2) { ...

Что значит это строка кода? - C++
int _tmain(int argc, _TCHAR* argv) Объясните пожалуйста что значит этот участок кода, или дайте ссылку на какой либо ресурс для...

Что это значит: *(void**)ReturnValue) = hHeap; ? - C++
Вот честно, не могу понять что значит вторая строчка кода: void* ReturnValue = (void*) HeapAlloc((HANDLE) hHeap,...

Ссылка как параметр шаблона. Что это значит? - C++
Увидел в данной теме http://www.cyberforum.ru/cpp-beginners/thread1900008.html что шаблонный тип можно указать как ссылку. Судя по тесту...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
27.01.2013, 18:17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru