![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
![]()
![]() Это сообщение отредактировал(а) mes - 6.4.2009, 03:09 |
||||
|
|||||
inside_pointer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 9.3.2008 Репутация: 5 Всего: 12 |
а как она проверит first operand ? как она узнает, что first operand - это first operand, она дойдёт до операции && после -, потому что у - приоритет выше, а у -> ещё выше, чем у - получается эта проверка первого операнда выше всех операций, так как не выполняет второй операнд, хотя там содержится операция ->, потому что знает, что это second operand и его выполнять нельзя, пока не пройдёт проверка для first operand |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
проверка и сама операция && не одно и то же, это два разных действия. грубо говоря bool res = a1 && a2, в реальности является :
где __&& "обычный"(без соблюдения правила сокращенногo вычисления) логический оператор АND . |
|||
|
||||
Fazil6 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
ты вообще сам читаешь что пишешь? куда оно дойдет? Приоритет операций определяется до того как вычисляются выражения. И во время определения приоритета определяется какое выражение будет операндом какой операции и после этого начинается вычисление операндов
если уж ты хочешь с точки зрения приоритета : a1 && a1->a - тут && самый низкий приоритет, значит его операндами будут выражения a1 и а1->a. И только тут начинается вычисление операндов. Так что до операции && она дойдет намого раньше, чем начнет вычислять операнды. И какой из них правый, а какой левый компилятор всегда знает. При реализации выражений как правило строится дерево. Корень - оператор с наименьшим приоритетом. Левая ветка - выражение левого операнда , правая - правого. Левый и правый в свою очередь такиеже деревья начинающиеся с самой неприоритетной операции и левого и правого выражений операндов этого оператора. Приотритет нужен для построения этого дерева и ничего при этом не вычисляется. А вычисляться начинает тогда, когда уже порядок вычисления выражения четко определен и приоритет операторов дальше уже никак ни на что не влияет. Обходим сначала левую часть дерева - получили первый операнд. Потом обходим правую - второй. Так что никаких противоречий. |
|||
|
||||
0xDX |
|
|||
Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 6.2.2009 Репутация: нет Всего: нет |
Вообще то компилятор способен оптимизировать.........
пример
Здесь компилятор способен увидеть что лучше проверить сначало j на ноль(так как проверка на ноль выполняется быстрее, это свойство процессора), а потом думать что делать дальше. Так же в этом примере, не имеет разницу какое условие проверять первым(логического смысла), но здругой староны эту работу должен проделать программист, на уровне привычки........... |
|||
|
||||
inside_pointer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 9.3.2008 Репутация: 5 Всего: 12 |
ну вот же оно, это правило ![]() как оно следует из стандарта ? тем, что не определено обратное ? |
|||
|
||||
Fazil6 |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1653 Регистрация: 3.5.2006 Где: Минск Репутация: 35 Всего: 60 |
о, еще один... нельзя тут оптимизировать. ты читал предыдущие сообщения?
о чем речь вообще? какое правило? Стандарт тут причем? Я привел пример того как в компиляторе может быть реализовано вычисление выражений. Стандарт это не определяет. Можно и подругому - главное чтобы правильно работало. В стандарте написано, что оператор && имеет фиксированный порядок вычисления аргументов отличный от обычных операторов. Как это в компиляторе реализуют никого в стандарте не колышет. Я привел пример как можно это сделать, зачем используется приоритет и как фиксировать порядок вычисления. |
|||
|
||||
inside_pointer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 9.3.2008 Репутация: 5 Всего: 12 |
То есть, иными словами, в стандарте написано, что правый операнд никогда не вычислится раньше левого, а дальше компиляторы могут писать как хотят и реализовывать вычисления как хотят, главное чтобы это правило работало. Поэтому все предпочитают строить дерево от самой нижней операции, потому что так удобнее делать, а не потому что так в стандарте заложено. |
|||
|
||||
Ln78 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 274 Регистрация: 25.11.2006 Репутация: 13 Всего: 15 |
inside_pointer, на первой странице приводили цитату из стандарта. Не просто никогда не вычисляется раньше, но и никогда не вычисляется вообще, если первый аргумент false, например, здесь
изменение значения j при отрицательном i никогда не должно проводиться. |
|||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
Есть две формы записи ариф. выражения. 1. арифметическая a=4+b*6-c; 2. функциональная op-(op+(4,op*(b,6)),c); // где op - operator первая нужна для удобства записи человеком, вторая для трансляции кода компилятором. приорететы нужны, чтоб приводить первую форму записи ко второй и в дальнейшем не используются. как видите аргументы каждой функции видны еще до начала выполнения. для обычных функций и операторов порядок выполнения не определен, а для && требуется, ..(чтоб не повторяться см. выше в цитатах из стандарта) ![]() |
||||
|
|||||
inside_pointer |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 344 Регистрация: 9.3.2008 Репутация: 5 Всего: 12 |
я понял, что он по дереву не пойдёт туда, если пройдёт в первое, если там дерево
|
|||
|
||||
uxoos |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 11.8.2009 Репутация: нет Всего: нет |
Ещё вопрос по теме. Исключяются ли из кода пустые или бессмысленные операторы. Просто использую макросы которые оставляют такой мусор в коде.
Например, что из кода исключится, а что останется?
Знаю что некоторые компиляторы оптимизируют код, выявляют всегда верные условия, не используемые переменные и выдают предупреждения. И ещё, как посмотреть код с раскрытыми и заменёнными макросами? |
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
ключ /P добавить в настройки проекта (С\С++-Command line-Additional options) |
|||
|
||||
uxoos |
|
|||
Новичок Профиль Группа: Участник Сообщений: 11 Регистрация: 11.8.2009 Репутация: нет Всего: нет |
Я добавил(Project-Options-C++Linker-Advanced-Additional options-/P), но в Builder 2010 все по обычному. ![]() Это сообщение отредактировал(а) uxoos - 21.10.2009, 20:10 |
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
![]() они по этому пути выставляются: project properties->c/c++->preprocessor->generate preprocessed file попробуй добавить ключ -P к опциям компилятора. где добавлять - не знаю. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |