LINUX.ORG.RU
ФорумTalks

Что быстрее в цикле if a=>min and a<=max или if a=>min then a<=max ?

 


0

1

Собственно 2 примера кода. Заинтересовало из любопытства в каких интерпретаторах и компиляторах какой из двух алгоритмов и при каких условиях будет быстрее? Ясно что первый код яснее написан и теоретически компилятор может его оптимизировать. А второй код не выполняет 2 проверки за одну итерацию, если первая из двух проверок провальная.

for c=0 to 10000
 if a[c]<=max and a[c]>=min then
  ' Таки да
 end if
next

for c=0 to 10000
 if a[c]<=max then
  if a[c]>=min then
  ' Таки да
  end if
 end if
next
☆☆☆

Последнее исправление: CYB3R (всего исправлений: 2)

Ясно что первый код яснее написан и теоретически компилятор может его оптимизировать. А второй код не выполняет 2 проверки за одну итерацию, если первая из двух проверок провальная.

в первом варианте так же. Компилятор соптимизирует. можешь проверить сам.

dikiy ★★☆☆☆
()

Во многих ЯП оператор and ленивый и не вычисляет второй операнд, если первый false. В том числе в пайтоне. Поэтому эти фрагменты кода идентичны.

Legioner ★★★★★
()

не выполняет 2 проверки за одну итерацию, если первая из двух проверок провальная.

в си так всегда и делается

Ower
()
Ответ на: комментарий от rival

да только что уже поменять хотел на i==2 || ++k.

тогда все как ожидаемо работает

dikiy ★★☆☆☆
()

А второй код не выполняет 2 проверки за одну итерацию, если первая из двух проверок провальная.

Как Вы думаете, почему в сях есть &, а есть && ?

Sadler ★★★
()

в первом случае все более менее нормальные компиляторы сделают одну проверку... например можно писать так:

if(p != nullptr && p->a > 10) { ... }

invy ★★★★★
()
Последнее исправление: invy (всего исправлений: 1)
Ответ на: комментарий от Legioner

Наверное потому. Чего сказать-то хотел? А, я понял! Ты такой молодец — названия операторов выучил, даже на русском. А ТСу будет полезно почитать о логике работы обоих.

Sadler ★★★
()
Последнее исправление: Sadler (всего исправлений: 3)
Ответ на: комментарий от rival

Какое вообще отношение битовые операции имеют к теме?

Прямое. Если бы автор использовал битовые операции вместо логических в тех же Сях, данный тред имел бы смысл.

Sadler ★★★
()
Последнее исправление: Sadler (всего исправлений: 1)

для случая С++ есть одна тонкость, язык действительно не выполнит вторую проверку на истинность в && если первая провальная, но это касается только встроенных операторов, но не перегруженных

next_time ★★★★★
()

и да, что за привычка писать всё в толкс: этот вопрос должен быть в девелопмент

next_time ★★★★★
()

Второй пример эмулирует нормальный порядок вычислений.
На интерпретаторе с аппликативным порядком вычислений он может отработать быстрее. Для интерпретатора с нормальным порядком вычислений оба примера идентичны.

aidaho ★★★★★
()
Ответ на: комментарий от arturpub

В качестве принимаемого, но не возвращаемого операторами:

#include <stdio.h>

int main () {
  int a;
  a = 2==2;
  printf("%d\n", a);
}
./test
1
Поэтому конструкция
if (a!=0 & b/a>1)
будет работать, как логическая, но давать ошибку при a=0 из-за того, что проверяться будут оба условия.

redgremlin ★★★★★
()
Ответ на: комментарий от redgremlin

Поэтому конструкция

if (a!=0 & b/a>1)

будет работать, как логическая, но давать ошибку при a=0 из-за того, что проверяться будут оба условия.

В этой конструкции всего одно условие.

edigaryev ★★★★★
()
Ответ на: комментарий от Sadler

Прямое. Если бы автор использовал битовые операции вместо логических в тех же Сях, данный тред имел бы смысл.

Если кто-то использует битовые операции вместо логических, у него, вероятно, большие проблемы с пониманием языка.

Legioner ★★★★★
()
Ответ на: комментарий от redgremlin

if (a!=0 & b/a>1)

Не самый плохой способ прострелить себе ногу. Много лишних ног?

Xellos ★★★★★
()
Ответ на: комментарий от Legioner

Если кто-то использует битовые операции вместо логических, у него, вероятно, большие проблемы с пониманием языка.

Если кто-то не может представить себе использование языка в рамках синтаксиса, у него ещё большие проблемы с пониманием языка.

Sadler ★★★
()
Ответ на: комментарий от redgremlin

в сишке true равно 1

Я надеюсь, твой код никто не читает, и кроме как на локалхосте он нигде не выполняется.

Xellos ★★★★★
()

Ну возьми и посмотри. Или компилятор не имеет возможности выдать ассмблерный листинг?

fornlr ★★★★★
()
Ответ на: комментарий от redgremlin

if (a!=0 & b/a>1)

:D на такое наступишь, обе ноги оторвет, да еще без глаз оставит.

arturpub ★★
()

на той области обпределения( «вообще») , что совсем не конретезированна

ответ

по разному, зависит от архитектуры компилятора/интерпретатора и семантики языка

qulinxao ★★☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.