Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Работа операторов
 
 автор: NSDaler   (05.06.2010 в 11:13)   письмо автору
 
 

Объясните плзззз, не обращайте, что это Си
int X;
X=12/6==2 || 12%5!=0 && 12%2==0;


PHP:
$X=12/6==2 || 12%5!=0 && 12%2==0;


почему X будет равен 1, подробно объясните плззз

  Ответить  
 
 автор: Valick   (05.06.2010 в 11:17)   письмо автору
 
   для: NSDaler   (05.06.2010 в 11:13)
 

с чего Вы взяли что Х будет равно единице?

  Ответить  
 
 автор: NSDaler   (05.06.2010 в 11:21)   письмо автору
 
   для: Valick   (05.06.2010 в 11:17)
 

скомпилировал на C =))

  Ответить  
 
 автор: NSDaler   (05.06.2010 в 11:25)   письмо автору
 
   для: NSDaler   (05.06.2010 в 11:21)
 

все сам догадался =)

ещё один вопрос:
у операторов деления, умножения, +, - выше приоритет, чем у ==, ||, !=, !
??
а у оператора == выше приоритет, чем у ||

  Ответить  
 
 автор: NSDaler   (05.06.2010 в 11:25)   письмо автору
 
   для: NSDaler   (05.06.2010 в 11:25)
 

так ведь?

  Ответить  
 
 автор: Trianon   (05.06.2010 в 11:50)   письмо автору
 
   для: NSDaler   (05.06.2010 в 11:25)
 

У операций деления, умножения, +, - выше приоритет, чем у ==, ||, !=, !

а у операции == выше приоритет, чем у ||

а у всех перечисленных приоритет выше чем у операции =

  Ответить  
 
 автор: Valick   (05.06.2010 в 11:26)   письмо автору
 
   для: NSDaler   (05.06.2010 в 11:21)
 

$X = 2 потому что 12/6 это 2 которое присваивается переменной $X, и 2 == 2 - истинно

  Ответить  
 
 автор: sim5   (05.06.2010 в 11:27)   письмо автору
 
   для: Valick   (05.06.2010 в 11:26)
 

Валик, вы ошибаетесь.

  Ответить  
 
 автор: sim5   (05.06.2010 в 11:25)   письмо автору
 
   для: NSDaler   (05.06.2010 в 11:13)
 

X равно: если 12/6 равно 2 (выполяняется условие, значит получаем ИСТИНУ (true, 1) ИЛИ 12 деленное по модулю 5 не равно 0 (выполняется условие, то есть опять ИСТИНА (1)) И 12 деленное по модулю 2 равно нулю (выполняется условие, то есть опять ИСТИНА (1)) = 1 ИЛИ 1 И 1 = 1.
Не зависимо от результата операций после условия ИЛИ, Х в данном случае всегда будет равен 1, так как первая операция дает 1.

  Ответить  
 
 автор: Valick   (05.06.2010 в 11:28)   письмо автору
 
   для: sim5   (05.06.2010 в 11:25)
 

Х в данном случае всегда будет равен 1
??
может $X всегда будет равно 2, а условие всегда будет ИСТИНА (true,1)

  Ответить  
 
 автор: sim5   (05.06.2010 в 11:34)   письмо автору
 
   для: Valick   (05.06.2010 в 11:28)
 

Вы опять заблуждаетесь:
12/6==2, это условие

  Ответить  
 
 автор: Valick   (05.06.2010 в 11:40)   письмо автору
 
   для: sim5   (05.06.2010 в 11:34)
 

$X=(12/6==2) или все таки ($X=12/6)==2
___
угу проверил... первое

  Ответить  
 
 автор: sim5   (05.06.2010 в 11:46)   письмо автору
 
   для: Valick   (05.06.2010 в 11:40)
 

Вот что дурковать-то, лень запустить Денвер и посмотреть, что вы получите?
Дано условие (!) 12/6==2. Компьютер будет вычислять:
12 поделит на 6, получит 2
сравнит, равен ли результат 2
2 = 2, значит в результате получаем ИСТИНУ и возвращаем ее (флаг Zero, сброшен).
Истина, это 1, булево значение true. Не верите, проверьте: echo true;

  Ответить  
 
 автор: Valick   (05.06.2010 в 11:51)   письмо автору
 
   для: sim5   (05.06.2010 в 11:46)
 

Ну не прав ну и что? Просто я не полагаюсь на приоритеты по умолчанию и мне не лень расставить скобки
Моя вина здесь лишь в том что я не полез в мануал перед тем как ответить на вопрос

  Ответить  
 
 автор: sim5   (05.06.2010 в 11:55)   письмо автору
 
   для: Valick   (05.06.2010 в 11:51)
 

И зачем в данном случае надо расставлять скобки? Можно пудумать, что ($X=12/6)==2 даст результат отличный от 1.

  Ответить  
 
 автор: Valick   (05.06.2010 в 11:57)   письмо автору
 
   для: sim5   (05.06.2010 в 11:55)
 

я все таки не поленился запустить Денвер :)
$X будет равно 2, а вот против того что условие будет выполняться в любом случае я никогда и не спорил

  Ответить  
 
 автор: sim5   (05.06.2010 в 12:03)   письмо автору
 
   для: Valick   (05.06.2010 в 11:57)
 

Ну вот опять 25, не будет он равен 2.

  Ответить  
 
 автор: Valick   (05.06.2010 в 12:04)   письмо автору
 
   для: sim5   (05.06.2010 в 12:03)
 

проверяли?
<? 
if(($X=12/6)==2) echo $X;
?> 

  Ответить  
 
 автор: NSDaler   (05.06.2010 в 12:08)   письмо автору
 
   для: Valick   (05.06.2010 в 12:04)
 

канечно тут X=2
ведь вы сначала к X присваиваете 2 а потом сравниваем 2==2, НО X=2, для того чтобы верно получить, надо так написать
if($X=($X=12/6)==2) echo $X; 

  Ответить  
 
 автор: sim5   (05.06.2010 в 12:16)   письмо автору
 
   для: NSDaler   (05.06.2010 в 12:08)
 

Ну вы мудрец! Вы думаете, что процессор разделит 12 на 6, вернет это значение интерпретатору, тот присвоит его Х, затем запросит опять процессор сравить Х с двойкой?
Как бы не так - 2, это промежуточный результат и гонять его туда-сюда накладно и не выгодно. 2 как рузультат певого вычисления хранится в аккумуляторе, и процессор продолжит выполять команды далее (конвейер команд), так как вычисление еще не закончилось, и так пока не будет вычислено все выражение, и его рузультат в конечном итоге будет присвоен Х.
А вот если это выражение записать так (виден смысл общей операции):
<?
if(12/6==|| 12%!= && 12%== 0)

то интрепретатору достаточно проверить только истину первого выражения, ибо за ним следут условие логического ИЛИ - если будут истина, то дальнейшее вычисление он остановит, иначе будет продолжать.

PS. Вернее, это уже сами процессоры могут делать - предсказывать ветвление в зависимости от результата операций.

  Ответить  
 
 автор: Trianon   (05.06.2010 в 13:23)   письмо автору
 
   для: sim5   (05.06.2010 в 12:16)
 

>и так пока не будет вычислено все выражение, и его рузультат в конечном итоге будет присвоен Х.

чушь.
Операция присваивания - часть выражения.
Невозможно вычислить всё выражение, не выполнив присваивания, как одной из операций, это выражение составляющих..

  Ответить  
 
 автор: sim5   (05.06.2010 в 13:28)   письмо автору
 
   для: Trianon   (05.06.2010 в 13:23)
 

Даже так? Стек для этого существует - результат первого выражения в стек, вычислили второе, извлекли из стека и сравнили, и т.д.. А вообще, нынешние процессоры загружают в память комманд гораздо больше, нежели это просто выражение, просто в данном случае интерпретатор выполняет строки.
Если бы процессоры вычисляли так, как вы хотите, играть бы вам до сих пор на них в Тетрис, не более. )

  Ответить  
 
 автор: Trianon   (05.06.2010 в 14:07)   письмо автору
 
   для: sim5   (05.06.2010 в 13:28)
 

Для того чтобы конструктивно обсуждать, что происходит, нужно отвлечься и от регистров , и от стека , и от вершины стека выражения, отображенной на набор свободных регистров генератором кода, и вспомнить о грамматике.
Процессоры вычисляют выражения так, как хочет генератор кода с оптимизатором.
К пониманию того, как выражение следует интерпретировать, этот аспект имеет отношение, конечно, но весьма слабое.

PS. Таки да, весьма слабое. Хотите этого Вы - Вы лично. Или не хотите.

PPS. Кстати, тупой код, построенный примитивным генератором чисто по грамматике безо всякой оптимизации (если он компилированный, или хотя бы шитый) - весма шусёр, как ни странно.
Основная потеря производительности идет на интерпретации. Но у нас то на старте треда - С.
Так что.

  Ответить  
 
 автор: sim5   (05.06.2010 в 16:00)   письмо автору
 
   для: Trianon   (05.06.2010 в 14:07)
 

Ну давайте "обсосем конструктивно".
Если говорить конструктивно, то стоит рассмотреть именно варианты, ибо в различных средах это бует решаться по разному.
1. Решаем на листике бумаги. Условно мы первоклашки.
Х = 12 разделить на 6 равно ли 2?
Х = 12/6 = 2
Х = 2
2 равно 2?
Ответ: равно.

2. Мы немного повзрослели, и научились держать результаты некоторых операций в уме.
Х = 12 разделить на 6 равно ли 2?
Х = 12/6 = 2 (держим в уме) равно ли то что мы держим в уме 2, то есть 2 равно 2?
Ответ: равно.

3. Решаем задачу на компьютере, еще первом, восмиразрядном, ассемблером.
MOV A,12
DIV A,6
SUB A,2
JIZ OUT
.....
OUT: MOV M,1
Даже на такой слабенькой машине, мне и в голову не придет добавлять в программу команду помещения значения аккумулятора после деления в ячейку памяти, ибо она просто ни к чему, лишняя. Для решения этой задачи и временного хранения не требуется.
Если нужно будет решить, например, 12/6 == 2 || 4-3>1, то решив первое, после команды SUB выполняем PUSH PSW, сохранив регистр флагов в стек, решив второе, извлечем стек в регистр В и сравним его значение с аккумулятором. Но это на старенькой машине, и если не думать программисту. А если думать, то все, что после ||, решали бы только в том случае, если бы результатом первого выражения был бы 0 (флаг).

4. Интерпретатор преобразует такую задачу (выражение) в машинный код, и с условием того, что нынешние процессоры имеют конвейр команд, и не один, а также могут предсказывать ветвление кода в зависимости от результата выполнения некоторых условных операций. Из этого следует, что РНР поступает исходя из возможностей процессора, то есть:
а) данное выражение преобразуется в поток команд для процессора, процессор загружает их в конвейер, а интерпретатор ожидает результат выражения.
б) код в команды преобразуется последовательно и отдается процессору последовательно, и после каждой арефметической и логической опрерациях, он, беспокоясь, требует результат их выполнения... в общем, в этом случае РНР писали первоклашки.

Вот что-то сомнительно мне, что первоклашки.

  Ответить  
 
 автор: sim5   (05.06.2010 в 11:57)   письмо автору
 
   для: sim5   (05.06.2010 в 11:46)
 

*** Примечание: флаг Zero, установлен. ))

  Ответить  
 
 автор: NSDaler   (05.06.2010 в 12:03)   письмо автору
 
   для: sim5   (05.06.2010 в 11:57)
 

спасибо вам огромное, вроде бы простая тема, а в заблуждение вводит =)))
вот к зачету все вспомнил=)

  Ответить  
 
 автор: sim5   (05.06.2010 в 12:38)   письмо автору
 
   для: NSDaler   (05.06.2010 в 12:03)
 

Да ничего в этом блуждающего нет, если знать приоритеты и логику.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования