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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Узкое ли это место в программе? особенности компиляции или всегда верно 
V
    Опции темы
Ln78
Дата 3.4.2009, 17:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(inside_pointer @  3.4.2009,  18:15 Найти цитируемый пост)
почему операция -> не выполнится первее && ? 

inside_pointer
Это разные вещи. Если бы операция && была приоритетнее ->, то выражение, о котором был задан вопрос было бы эквивалентно:
Код

if ( ( p_my_class && p_my_class ) -> myMethod() )
 
 smile 
PM MAIL   Вверх
inside_pointer
Дата 4.4.2009, 01:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mes)

операция -> выполнится вперед операции &&, но до нее дойдет только в случае, если p_my_class "правдив."

почему она будет так выполняться, каким образом она проверит, что первый операнд правдив, по какому правилу ?
что значит зависимые операции ?

Ln78, он спросил так, как спросил - не разыменуется ли нулевой указатель smile

PM MAIL   Вверх
zim22
Дата 4.4.2009, 07:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(inside_pointer @  4.4.2009,  01:42 Найти цитируемый пост)
почему она будет так выполняться, каким образом она проверит, что первый операнд правдив, по какому правилу ?

по такому правилу: если в результате вычисления выражения мы получим 0 - то FALSE, иначе - TRUE
http://forum.vingrad.ru/index.php?showtopi...t&p=1831461


--------------------
PM MAIL   Вверх
mes
Дата 4.4.2009, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(inside_pointer @  4.4.2009,  00:42 Найти цитируемый пост)

что значит зависимые операции ?

те которые имеют общий операнд.
10-2*3  // - и * зависымые и вначале выполнится умножение потом вычитание10
10-5+2*3 // - и * не зависимы друг от друга и порядок их выполнения не определен.


Цитата(inside_pointer @  4.4.2009,  00:42 Найти цитируемый пост)
почему она будет так выполняться, каким образом она проверит, что первый операнд правдив, по какому правилу ?

воэьмем пример : a && ++b; 
у ++ приоритет больше, но до нее дойдет только если а is  true
т.е вышеупомянутое  выражение разбивается на операции следующим условным образом
Код

int result = a; 
if (result)  
{ ++b;   
   result = a && b;
}


inside_pointer, и вдумайтесь так же, что написал Ln78
Цитата(Ln78 @  3.4.2009,  16:53 Найти цитируемый пост)
Это разные вещи. Если бы операция && была приоритетнее ->, то выражение, о котором был задан вопрос было бы эквивалентно:
Код

if ( ( p_my_class && p_my_class ) -> myMethod() )

  smile  



Это сообщение отредактировал(а) mes - 4.4.2009, 10:26


--------------------
PM MAIL WWW   Вверх
GoldFinch
Дата 4.4.2009, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(inside_pointer @  3.4.2009,  03:33 Найти цитируемый пост)
, - может не быть операцией

чем же operator,() отличается от operator&&() ?
PM MAIL ICQ   Вверх
zim22
Дата 4.4.2009, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(GoldFinch @  4.4.2009,  11:59 Найти цитируемый пост)
чем же operator,() отличается от operator&&() ?

я знаю! я знаю! можно я отвечу! можно!? можно!? smile


--------------------
PM MAIL   Вверх
inside_pointer
Дата 4.4.2009, 13:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mes)

10-5+2*3 // - и * не зависимы друг от друга и порядок их выполнения не определен.

это 10-5+(2*3), не определён порядок для операции +, то есть может выполниться как и умножение сначала, так и вычитание

однако не будет чего-нибудь типа 10-(5+2)*3 или ((10-5)+2)*3, то есть операции по приоритетам выстроены однозначно

Код

if (p_my_class && p_my_class->myMethod())

почему вот здесь, когда у && низкий приоритет, не может быть такого, что выполнится -> ? zim22, понимаешь у них приоритет разный у -> самый высокий, а у && чуть ли не как у присваивания и тут получается, что у неё приоритет не выше, чем у ->, так как, действительно, метод бы вызывался из 0 или 1, но при этом есть какое-то правило, которое выше приоритета, а формулировки его чо-то не видно, почему оно выше приоритета
PM MAIL   Вверх
GoldFinch
Дата 4.4.2009, 13:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



Цитата(zim22 @  4.4.2009,  14:28 Найти цитируемый пост)
я знаю! я знаю! можно я отвечу! можно!? можно!?

ну и ответил бы, флудер
PM MAIL ICQ   Вверх
zim22
Дата 4.4.2009, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(GoldFinch @  4.4.2009,  13:36 Найти цитируемый пост)
ну и ответил бы, флудер

йес!

&& - это логическая бинарная операция
, - это оператор, который используется в случаях, где ряд выражений отделяется запятыми. Выполнены будут все операнды оператора в отличии от &&, где второй операнд будет выполнен, только если первый операнд был true

А вообще это две разные операции, которые никак друг с другом не связаны. и они не взаимозаменяемы smile

Добавлено через 1 минуту и 26 секунд
Цитата(inside_pointer @  4.4.2009,  13:33 Найти цитируемый пост)
zim22, понимаешь у них приоритет разный

вы не могли бы как-то выделять обращение ко мне. а то я еле нашёл в тексте, что вы и мне отвечали.

Это сообщение отредактировал(а) zim22 - 4.4.2009, 13:41


--------------------
PM MAIL   Вверх
mes
Дата 4.4.2009, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(zim22 @  4.4.2009,  12:41 Найти цитируемый пост)
, - это оператор, который используется в случаях, где ряд выражений отделяется запятыми. Выполнены будут все операнды оператора в отличии от &&, где второй операнд будет выполнен, только если первый операнд был true

zim22GoldFinch спрашивал немножко не об этом.
Цитата(GoldFinch @  4.4.2009,  10:59 Найти цитируемый пост)
Цитата

, - может не быть операцией

чем же operator,() отличается от operator&&() ? 

его интересовало, почему "," не всегда оператор. Потому что иногда она является обычным разделителем, например в списке параметров.  smile 








--------------------
PM MAIL WWW   Вверх
inside_pointer
Дата 4.4.2009, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(zim22)

вы не могли бы как-то выделять обращение ко мне. а то я еле нашёл в тексте, что вы и мне отвечали.

да там инфа не важная, если пропустишь, ничо не изменится smile
PM MAIL   Вверх
mes
Дата 4.4.2009, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(inside_pointer @  4.4.2009,  12:33 Найти цитируемый пост)
это (10-5)+(2*3), не определён порядок для операции +, то есть может выполниться как и умножение сначала, так и вычитание

Как раз для + определен. Она выполнится 3й. После - и *. А вот кто из последних двух выполнится первым не определено.
А вот в выражении (10-5) && (2*3) порядок определен. Первым выполнится -, потом (если условие верно) выполнится *, и самым последним &&. 
Как видите приоретет в случае не связанных операций влияния на порядок исполнения не оказывает.

Добавлено @ 14:46
Цитата(inside_pointer @  4.4.2009,  12:33 Найти цитируемый пост)
но при этом есть какое-то правило, которое выше приоритета, а формулировки его чо-то не видно, почему оно выше приоритета 

правило которое отличает + от && в только что упомянутом примере уже цитировалось в этой теме. Попробуйте найти его сами smile

Это сообщение отредактировал(а) mes - 4.4.2009, 14:57


--------------------
PM MAIL WWW   Вверх
inside_pointer
Дата 6.4.2009, 01:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mes)

А вот в выражении (10-5) && (2*3) порядок определен. Первым выполнится -,

а, тут типа слева направо происходят все вычисления, то есть разность будет найдена самой первой, так как её приоритет выше &&, сначала не будет проверено что (10-5) истина, сначала выполнится 10-5 а потом этот результат будет проверен, так как встречается следующая операция - &&
в итоге получаем, что значения в скобках читаются, а потом выполнение выражений внутри начинается слева направо (есть там логические операции или нет)
PM MAIL   Вверх
mes
Дата 6.4.2009, 02:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(inside_pointer @  6.4.2009,  00:45 Найти цитируемый пост)

а, тут типа слева направо происходят все вычисления, то есть разность будет найдена самой первой, так как её приоритет выше &&, сначала не будет проверено что (10-5) истина, сначала выполнится 10-5 а потом этот результат будет проверен, так как встречается следующая операция - &&
в итоге получаем, что значения в скобках читаются, а потом выполнение выражений внутри начинается слева направо (есть там логические операции или нет) 


нет, нет и еще раз нет.
приоретет нужен всего лишь чтоб разбить на пары:

Код

так (10-5)+ (2*3) 
разбивается как
int tmp1 = 10-5; 
int tmp2 = 2*3;
int res = tmp1+tmp2;

логично предположить что для оператора && тогда должна получиться аналогичная последовательность действий

Код

итак (10-5)+ (2*3) 
по идеи должно быть :
int tmp1 = 10-5;
int tmp2 = 2*3;
bool  res = tmp1 && tmp2;

однако из за того, что компилятoр должен соблюдать правило сокращенных вычислений, получается так
Код

но предтавляется как :

int tmp1 = 10-5;
/* 
bool  res =  (tmp1) ? tmp1 
                    : tmp1 && (2*3);
так как в каждом ветвлении значение tmp1 очевидно, то запишем в более простой конструкции
*/
bool  res =  (tmp1) ? false 
                    :  (2*3);

можно подойти еще с другого конца
так например  
Код

(10-5)+ (2*3) 
это 
operator +(operator-(10,5),operator*(2,3));

а теперь попробуйте записать в такой же форме выражение (10-5)&& (2*3)  с соблюдением вышеназванного правила smile





Это сообщение отредактировал(а) mes - 6.4.2009, 02:04


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


Опытный
**


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

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



Всё, терь кое-что проясняется smile
PM MAIL   Вверх
Страницы: (4) Все 1 [2] 3 4 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

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

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


 




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


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

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