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

Поиск:

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


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


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

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



Цитата

ясно теперь, что правило какое-то есть smile

 smile 
Цитата

Unlike &, && guarantees left- to-right evaluation: the second operand is not evaluated if the  first
  operand is false.


 smile 

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


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


Опытный
**


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

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



Код

the second operand is not evaluated if the  first  operand is false

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


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


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

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



Цитата(inside_pointer @  6.4.2009,  09:31 Найти цитируемый пост)
а как она проверит first operand ? как она узнает, что first  operand - это first  operand, она дойдёт до операции && после -, потому что у - приоритет выше, а у -> ещё выше, чем у -
получается эта проверка первого операнда выше всех операций, так как не выполняет второй операнд, хотя там содержится операция ->, потому что знает, что это second operand и его выполнять нельзя, пока не пройдёт проверка для first operand 

проверка и сама операция && не одно и то же, это два разных действия.
грубо говоря bool res = a1 && a2, в реальности является  :
Код

bool res = (a1) ? a1 : a1 __&& a2;

где __&& "обычный"(без соблюдения правила сокращенногo вычисления) логический оператор АND .




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


Эксперт
***


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

Репутация: 35
Всего: 60



Цитата(inside_pointer @  6.4.2009,  10:31 Найти цитируемый пост)
как она проверит first operand ? как она узнает, что first  operand - это first  operand, она дойдёт до операции && после -, потому что у - приоритет выше, а у -> ещё выше, чем у -

ты вообще сам читаешь что пишешь? куда оно дойдет? Приоритет операций определяется до того как вычисляются выражения. И во время определения приоритета определяется какое выражение будет операндом какой операции и после этого начинается вычисление операндов

Код

if ( a1.a && a2.a )
{
   // bla-bla
}


если уж ты хочешь с точки зрения приоритета :  a1 && a1->a  - тут && самый низкий приоритет, значит его операндами будут выражения  a1 и а1->a.   И только тут начинается вычисление операндов. Так что до операции && она дойдет намого раньше, чем начнет вычислять операнды. И какой из них правый, а какой левый компилятор всегда знает.
При реализации выражений как правило строится дерево. Корень - оператор с наименьшим приоритетом. Левая ветка - выражение левого операнда , правая - правого. Левый и правый в свою очередь такиеже  деревья начинающиеся с самой неприоритетной операции и левого и правого выражений операндов этого оператора.  Приотритет нужен для построения этого дерева и ничего при этом не вычисляется. А вычисляться начинает тогда, когда уже порядок вычисления выражения четко определен и приоритет операторов дальше уже никак ни на что не влияет.
Обходим сначала левую часть дерева - получили первый операнд. Потом обходим правую - второй. Так что никаких противоречий. 
PM MAIL   Вверх
0xDX
Дата 7.4.2009, 02:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вообще то компилятор способен оптимизировать.........
пример
Код

if(a==5 && j)
{
//какой то прикол
}

Здесь компилятор способен увидеть что лучше проверить сначало j на ноль(так как проверка на ноль выполняется быстрее, это свойство процессора), а потом думать что делать дальше. Так же в этом примере, не имеет разницу какое условие проверять первым(логического смысла), но здругой староны эту работу должен проделать программист, на уровне привычки...........
PM MAIL   Вверх
inside_pointer
Дата 7.4.2009, 03:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Fazil6)

Корень - оператор с наименьшим приоритетом.

ну вот же оно, это правило smile
как оно следует из стандарта ? тем, что не определено обратное ?
PM MAIL   Вверх
Fazil6
Дата 7.4.2009, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 35
Всего: 60



Цитата(0xDX @  7.4.2009,  02:47 Найти цитируемый пост)
Вообще то компилятор способен оптимизировать.........

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


Цитата(inside_pointer @  7.4.2009,  03:28 Найти цитируемый пост)
ну вот же оно, это правило smile
как оно следует из стандарта ? тем, что не определено обратное ? 

о чем речь вообще?
какое правило? Стандарт тут причем?
Я привел пример того как в компиляторе может быть реализовано вычисление выражений. Стандарт это не определяет. Можно и подругому - главное чтобы правильно работало. В стандарте написано, что оператор && имеет фиксированный порядок вычисления аргументов отличный от обычных операторов. Как  это в компиляторе реализуют никого в стандарте не колышет. Я привел пример как можно это сделать, зачем используется приоритет и как фиксировать порядок вычисления.
PM MAIL   Вверх
inside_pointer
Дата 7.4.2009, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Fazil6)

В стандарте написано, что оператор && имеет фиксированный порядок вычисления аргументов отличный от обычных операторов.

То есть, иными словами, в стандарте написано, что правый операнд никогда не вычислится раньше левого, а дальше компиляторы могут писать как хотят и реализовывать вычисления как хотят, главное чтобы это правило работало.
Поэтому все предпочитают строить дерево от самой нижней операции, потому что так удобнее делать, а не потому что так в стандарте заложено.
PM MAIL   Вверх
Ln78
Дата 8.4.2009, 08:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(inside_pointer @  7.4.2009,  23:16 Найти цитируемый пост)
 стандарте написано, что правый операнд никогда не вычислится раньше левого, а дальше компиляторы могут писать как хотят и реализовывать вычисления как хотят, главное чтобы это правило работало.


inside_pointer, на первой странице приводили цитату из стандарта. Не просто никогда не вычисляется раньше, но и никогда не вычисляется вообще, если первый аргумент false, например, здесь
Код

   if( i >= 0 && ++j > 5 )

изменение значения j при отрицательном i никогда не должно проводиться.
PM MAIL   Вверх
mes
Дата 8.4.2009, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(inside_pointer @  7.4.2009,  02:28 Найти цитируемый пост)
Цитата

Корень - оператор с наименьшим приоритетом.
ну вот же оно, это правило smile

Есть две формы записи ариф. выражения.
1. арифметическая  a=4+b*6-c;
2. функциональная op-(op+(4,op*(b,6)),c); // где op - operator
первая нужна для удобства записи человеком, вторая для трансляции кода компилятором.
приорететы нужны, чтоб приводить первую форму записи ко второй и в дальнейшем не используются.

как видите аргументы каждой функции видны еще до начала выполнения.
для обычных функций и операторов порядок выполнения не определен, а для && требуется, ..(чтоб не повторяться см. выше в цитатах из стандарта)  smile 
 




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


Опытный
**


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

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



я понял, что он по дереву не пойдёт туда, если пройдёт в первое, если там дерево
PM MAIL   Вверх
uxoos
  Дата 21.10.2009, 01:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ещё вопрос по теме. Исключяются ли из кода пустые или бессмысленные операторы. Просто использую макросы которые оставляют такой мусор в коде.
Например, что из кода исключится, а что останется?
Код
;
5+4;
{int a;}
();
"Эта строка просто весит в коде, очень не хочется чтобы она занимала стек или что-нибудь подобное там..";

Знаю что некоторые компиляторы оптимизируют код, выявляют всегда верные условия, не используемые переменные и выдают предупреждения. И ещё, как посмотреть код с раскрытыми и заменёнными макросами?
PM MAIL   Вверх
zim22
Дата 21.10.2009, 07:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(uxoos @  21.10.2009,  01:17 Найти цитируемый пост)
 И ещё, как посмотреть код с раскрытыми и заменёнными макросами?

ключ /P добавить в настройки проекта (С\С++-Command line-Additional options)


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


Новичок



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

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



Цитата
ключ /P добавить в настройки проекта (С\С++-Command line-Additional options)

Я добавил(Project-Options-C++Linker-Advanced-Additional options-/P), но в Builder 2010 все по обычному. smile Объясни, пожалуйста поподробнее.

Это сообщение отредактировал(а) uxoos - 21.10.2009, 20:10
PM MAIL   Вверх
zim22
Дата 21.10.2009, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Цитата(uxoos @  21.10.2009,  20:07 Найти цитируемый пост)
но в Builder 2010 все по обычному. 

smile я настройки для Microsoft Visual Studio привёл. 
они по этому пути выставляются: project properties->c/c++->preprocessor->generate preprocessed file

попробуй добавить ключ -P к опциям компилятора. где добавлять - не знаю.




--------------------
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.0900 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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