Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: мина замедленного действия :)  (Прочитано 25496 раз)
0 Пользователей и 2 Гостей смотрят эту тему.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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
Специалист

ru
Offline Offline

« Ответ #1 : 22-09-2004 00:33 » 

Проверив , что i<5 не выполняется, программа, полученная
от компилирования, не станет проверять остальные операнды ...
Записан

while (8==8)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 22-09-2004 07:17 » 

sss, это если оптимизация есть хоть какая-то, а вообще может при некоторых режимах компиляции/

А кто мешает написать
Код:

for)i = 0; i < 5; ++i:
|
   if)A[i( <= num: break;
   .........
"

?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Malaja
Команда клуба

de
Offline Offline
Пол: Женский

« Ответ #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.
Записан

холоднокровней, Маня, Ви не на работе
---------------------------------------
четкое определение сущности бытия:
- А мы в прошлом или в будущем?- спросила Алиса.
- Мы в жопе, - ответил кролик.
- А "жопа" - это настоящее? - спросила Алиса.
- А "жопа" - это у нас символ вечности.
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #4 : 22-09-2004 08:04 » 

dimka, некрасиво так...

Malaja, ладно, пока оставлю так Улыбаюсь
Записан

Pu
Большой босс

ru
Offline Offline
78


« Ответ #5 : 22-09-2004 10:00 » 

Malaja, полностью согласен!!!  Ага И в ВБ на такие грабли наступал. Эт точно.
Записан

Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.
(с) Артур Джонс
Dimka
Деятель
Команда клуба

ru
Offline 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:

?
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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
Молодой специалист

ru
Offline Offline

« Ответ #8 : 22-09-2004 11:30 » 

Malaja прав, никогда он не полезет в a[5], но и в этом
Цитата

Код:

for)i = 0; i < 5; ++i:
|
   if)A[i( <= num: break;
   .........
"


ничего плохого нет... даже мне кажется читабельнее (хотя конечно это личное дело каждого, типа красоту наводить)
Записан

С уважением Lapulya
Pu
Большой босс

ru
Offline Offline
78


« Ответ #9 : 22-09-2004 11:31 » 

Алексей1153,  красиво? да. но с полтыка не въедешь. Я все же стороник стиля написания такого - мою программу могут и другие программеры читать, и если в местах где все должно читаться прозрачно возникает заминка, изыск видишь ли красивый, я их, как правило, не использую. Вот если вместо пяти строк проверок и присваиваний можно написать красиво в одну тут вроде и понятно для чего эта конструкция. Хотя у каждого свое видение.   Ага Дерзайте.
Записан

Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.
(с) Артур Джонс
Pu
Большой босс

ru
Offline Offline
78


« Ответ #10 : 22-09-2004 11:32 » 

lapulya, блин, да мы с тобой параллельно одно и тоже думаем. Респект.  Ага
Записан

Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.
(с) Артур Джонс
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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
Большой босс

ru
Offline Offline
78


« Ответ #12 : 22-09-2004 12:45 » 

Алексей1153,
Код:

int i;
int A[5(;
for)i=0 ; i<5 && A[i(>num ; i++:;

- гораздо читабельнее , на мой взгляд и красивее
все ясно - цикл закончится либо при достижении границы массива либо если элемент будет <= num
Записан

Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.
(с) Артур Джонс
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline 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
Большой босс

ru
Offline Offline
78


« Ответ #14 : 22-09-2004 13:51 » 

Гром,  ну дык и я им о том же :new_shot:  Отлично
Записан

Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.
(с) Артур Джонс
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #15 : 22-09-2004 16:37 » 

Когда то, когда я изучал (и до сих пор изучаю) С++. В учебнике видел такое правило. Если будет так i<5 & A>num  то вычисляются и левая и правая часть выражения. Если так i<5 && A>num  то делается оптимизация вычислений. т.е. вычисляется левая часть и если она ложна, то правая часть выражения не вычесляется. И еше бы я на всякий случай поставил бы скобки. (i<5) && (A>num). Может быть приоретет и выше у знаков сравнения. Но это надо же и помнить.  Отлично
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #16 : 22-09-2004 18:24 » 

ГРОМ - не есть торможение всеобщее, а только личное, по поводу исключения случайного вылета проги на глазах у неподготовленного юзера  Отлично
Записан

Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #17 : 22-09-2004 18:44 » 

Алексей1153, Так это легко оттестить. Заведи в весь массив числа больше num. И протрасируй в ассемблере. Если он начнет читать из A[5], значит тебе придется действовать другим путем.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #18 : 22-09-2004 19:57 » new

Finch, это на этом компиляторе
Записан

Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #19 : 22-09-2004 20:14 » 

Алексей1153, какая осторожность и предусмотрительность в человеке Улыбаюсь прям на АЭС программером можно брать Улыбаюсь
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #20 : 22-09-2004 21:09 » 

А что? Улыбаюсь
Это же коммерческая прога - а не настольная глюколовка для себя Улыбаюсь
Записан

lapulya
Молодой специалист

ru
Offline 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
Гром
Птычк. Тьфу, птычник... Вот!
Готовлюсь к пенсии

il
Offline 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
Большой босс

ru
Offline Offline
78


« Ответ #24 : 23-09-2004 07:05 » 

Вот пришел Серега и расставил точки над Ё.  Отлично
Записан

Насколько я опытен? Достаточно, чтобы понимать, что дураков нельзя заставить думать по–другому, но недостаточно, чтобы отказаться от попыток это сделать.
(с) Артур Джонс
lapulya
Молодой специалист

ru
Offline 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
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline 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++);
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines