Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« : 21-09-2004 20:34 » |
|
int i; int A[5]; for(i=0 ; i<5 && A[i ]>num ; i++);
не рискую ли я нарваться на чтение из непринадлежащей программе ячейки памяти (то есть A[5] ) ?
или проверив , что i<5 не выполняется, программа, полученная от компилирования, не станет проверять остальные операнды "И" ?
|
|
« Последнее редактирование: 14-04-2006 19:06 от Алексей1153 »
|
Записан
|
|
|
|
sss
Специалист
Offline
|
|
« Ответ #1 : 22-09-2004 00:33 » |
|
Проверив , что i<5 не выполняется, программа, полученная от компилирования, не станет проверять остальные операнды ...
|
|
|
Записан
|
while (8==8)
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #2 : 22-09-2004 07:17 » |
|
sss, это если оптимизация есть хоть какая-то, а вообще может при некоторых режимах компиляции/ А кто мешает написать for)i = 0; i < 5; ++i: | if)A[i( <= num: break; ......... "
?
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Malaja
|
|
« Ответ #3 : 22-09-2004 07:45 » |
|
dimka,
naskolko ja znaju, wne zawisimosti ot regima kompiljazii wse c/c++ - kompiljatori rabotajut po odnoj sheme : esli perwoe uslowie ne wipolneno, ostalnie ne prowerjajutsja, resutat = false. W VB - naoborot, tam prowerjaetsja wsja zepochka uslowij, poetomu tam nado bit ochen ostorognim.
|
|
|
Записан
|
холоднокровней, Маня, Ви не на работе --------------------------------------- четкое определение сущности бытия: - А мы в прошлом или в будущем?- спросила Алиса. - Мы в жопе, - ответил кролик. - А "жопа" - это настоящее? - спросила Алиса. - А "жопа" - это у нас символ вечности.
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #4 : 22-09-2004 08:04 » |
|
dimka, некрасиво так... Malaja, ладно, пока оставлю так
|
|
|
Записан
|
|
|
|
Pu
Большой босс
Offline
78
|
|
« Ответ #5 : 22-09-2004 10:00 » |
|
Malaja, полностью согласен!!! И в ВБ на такие грабли наступал. Эт точно.
|
|
|
Записан
|
Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать. (с) Артур Джонс
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #6 : 22-09-2004 10:31 » |
|
Алексей1153, ну знаешь ли... для полной академической чистоты цикл for вообще использовать вредно. Тогда будет так int i = 0; bool bf = A[i( > num; while) i < 5 && bf : | ....... ++i; if) i < 5 : bf = A[i( > num; "
а может так устроит for) i = 0; i < 5 ? A[i( > num { false; ++i:
?
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #7 : 22-09-2004 11:09 » |
|
за for(i=0; i<5?A[i]>num:false; ++i)
оригинально красиво серьёзно - так и сделаю
|
|
« Последнее редактирование: 14-04-2006 19:29 от Алексей1153 »
|
Записан
|
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #8 : 22-09-2004 11:30 » |
|
Malaja прав, никогда он не полезет в a[5], но и в этом for)i = 0; i < 5; ++i: | if)A[i( <= num: break; ......... "
ничего плохого нет... даже мне кажется читабельнее (хотя конечно это личное дело каждого, типа красоту наводить)
|
|
|
Записан
|
С уважением Lapulya
|
|
|
Pu
Большой босс
Offline
78
|
|
« Ответ #9 : 22-09-2004 11:31 » |
|
Алексей1153, красиво? да. но с полтыка не въедешь. Я все же стороник стиля написания такого - мою программу могут и другие программеры читать, и если в местах где все должно читаться прозрачно возникает заминка, изыск видишь ли красивый, я их, как правило, не использую. Вот если вместо пяти строк проверок и присваиваний можно написать красиво в одну тут вроде и понятно для чего эта конструкция. Хотя у каждого свое видение. Дерзайте.
|
|
|
Записан
|
Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать. (с) Артур Джонс
|
|
|
Pu
Большой босс
Offline
78
|
|
« Ответ #10 : 22-09-2004 11:32 » |
|
lapulya, блин, да мы с тобой параллельно одно и тоже думаем. Респект.
|
|
|
Записан
|
Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать. (с) Артур Джонс
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #11 : 22-09-2004 12:28 » |
|
Pu, но с полтыка не въедешь.
совершенно согласен, поэтому в коде я написал так: //for(Ray=0;Ray<m_NofRays && a_bShowRay[Ray];Ray++); for(Ray=0;(Ray<m_NofRays ? a_bShowRay[Ray] :false);Ray++);
|
|
|
Записан
|
|
|
|
Pu
Большой босс
Offline
78
|
|
« Ответ #12 : 22-09-2004 12:45 » |
|
Алексей1153, int i; int A[5(; for)i=0 ; i<5 && A[i(>num ; i++:;
- гораздо читабельнее , на мой взгляд и красивее все ясно - цикл закончится либо при достижении границы массива либо если элемент будет <= num
|
|
|
Записан
|
Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать. (с) Артур Джонс
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #13 : 22-09-2004 13:38 » |
|
Вы о чем Кошмар какой то. Итак: 1. Все комманды выполняются слева направо. 2. Условие "И" "&&" истино только тогда, когда оба условия истины. В остальных случаях выражение (i<5 && A >num) всегда ложь == 0.
Для полной уверенности что уловие воспримется совместным написать можно так:
int i; int A[5(; for)i=0 ; [b()[/b(i<5 && A[i(>num;[b(:[/b( i++:;
Что-то всеобщее торможение что ли напало
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
Pu
Большой босс
Offline
78
|
|
« Ответ #14 : 22-09-2004 13:51 » |
|
Гром, ну дык и я им о том же :new_shot:
|
|
|
Записан
|
Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать. (с) Артур Джонс
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #15 : 22-09-2004 16:37 » |
|
Когда то, когда я изучал (и до сих пор изучаю) С++. В учебнике видел такое правило. Если будет так i<5 & A >num то вычисляются и левая и правая часть выражения. Если так i<5 && A>num то делается оптимизация вычислений. т.е. вычисляется левая часть и если она ложна, то правая часть выражения не вычесляется. И еше бы я на всякий случай поставил бы скобки. (i<5) && (A>num). Может быть приоретет и выше у знаков сравнения. Но это надо же и помнить.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #16 : 22-09-2004 18:24 » |
|
ГРОМ - не есть торможение всеобщее, а только личное, по поводу исключения случайного вылета проги на глазах у неподготовленного юзера
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #17 : 22-09-2004 18:44 » |
|
Алексей1153, Так это легко оттестить. Заведи в весь массив числа больше num. И протрасируй в ассемблере. Если он начнет читать из A[5], значит тебе придется действовать другим путем.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #18 : 22-09-2004 19:57 » |
|
Finch, это на этом компиляторе
|
|
|
Записан
|
|
|
|
Dimka
Деятель
Команда клуба
Offline
Пол:
|
|
« Ответ #19 : 22-09-2004 20:14 » |
|
Алексей1153, какая осторожность и предусмотрительность в человеке прям на АЭС программером можно брать
|
|
|
Записан
|
Программировать - значит понимать (К. Нюгард) Невывернутое лучше, чем вправленное (М. Аврелий) Многие готовы скорее умереть, чем подумать (Б. Рассел)
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #20 : 22-09-2004 21:09 » |
|
А что? Это же коммерческая прога - а не настольная глюколовка для себя
|
|
|
Записан
|
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #21 : 22-09-2004 22:11 » |
|
Гром, ты о чем.... вопрос был такой .... не выйдет ли так что произойдет обращение к a[5], ответ такой НЕТ не выйдет потому как при i == 5 второе условие (типа вот это A >num ), а точнее значение этого выражения вычисляться НЕ будет и соответственно к a[5] обращений не будет
Finch, а при чем здесь вот энто
i<5 & A[i ]>num
? про него кто-то хоть что-то сказал... или у меня ваще крыша едет...
|
|
« Последнее редактирование: 14-04-2006 19:30 от Алексей1153 »
|
Записан
|
С уважением Lapulya
|
|
|
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии
Offline
Пол:
Бодрый птах
|
|
« Ответ #22 : 23-09-2004 05:47 » |
|
lapulya, попробу прочитать мое сообщение - там пунтк 1 есть сначала первое - если оно в условии = 0 то получается что второе вычислять не надо...
|
|
|
Записан
|
А птичку нашу прошу не обижать!!!
|
|
|
Serega
Гость
|
|
« Ответ #23 : 23-09-2004 06:42 » |
|
Вот кусок стандарта 5.14 Logical AND operator The && operator groups left-to-right. The operands are both implicitly converted to type bool )clause 4:. The result is true if both operands are true and false otherwise. Unlike &, && guarantees left-to-right evaluation{ the second operand is not evaluated if the first operand is false. The result is a bool. All side effects of the first expression except for destruction of temporaries )12.2: happen before the second expression is evaluated.
|
|
|
Записан
|
|
|
|
Pu
Большой босс
Offline
78
|
|
« Ответ #24 : 23-09-2004 07:05 » |
|
Вот пришел Серега и расставил точки над Ё.
|
|
|
Записан
|
Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать. (с) Артур Джонс
|
|
|
lapulya
Молодой специалист
Offline
|
|
« Ответ #25 : 23-09-2004 08:14 » |
|
Гром, дак я об этом и говорил... точнее об этом во ВТОРОМ посте темы сказал sss (правда ооочень каряво), потом четвертым постом это же подтвердила Malaja, мы с зайцем с ней согласились Serega, для верности притащил кусок из стандарта....ТОЕСТЬ обратного ни кто и не утверждал (что типа надо вычислять значение a при i = 5) .... вот... что А && В равно trueт олько если и А и В одновременно равны true ммммм тоже вроде не у кого сомнейний не вызывает... поэтому я и не понял к чему ты это
Вы о чем
Кошмар какой то. Итак: 1. Все комманды выполняются слева направо. 2. Условие "И" "&&" истино только тогда, когда оба условия истины. В остальных случаях выражение (i<5 && A>num) всегда ложь == 0.
Для полной уверенности что уловие воспримется совместным написать можно так:
Код: int i; int A[5]; for(i=0 ; (i<5 && A>num;) i++);
Что-то всеобщее торможение что ли напало
сказал... или я опять торможу :new_twist:
|
|
|
Записан
|
С уважением Lapulya
|
|
|
Алексей++
глобальный и пушистый
Глобальный модератор
Offline
Сообщений: 13
|
|
« Ответ #26 : 23-09-2004 08:41 » |
|
the second operand is not evaluated if the first operand is false.
короче можно смело оставлять for(i=0 ; i<5 && A>num ; i++);
|
|
|
Записан
|
|
|
|
|