|
|
|
| Объясните плзззз, не обращайте, что это Си
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, подробно объясните плззз | |
|
|
|
|
|
|
|
для: NSDaler
(05.06.2010 в 11:13)
| | с чего Вы взяли что Х будет равно единице? | |
|
|
|
|
|
|
|
для: Valick
(05.06.2010 в 11:17)
| | скомпилировал на C =)) | |
|
|
|
|
|
|
|
для: NSDaler
(05.06.2010 в 11:21)
| | все сам догадался =)
ещё один вопрос:
у операторов деления, умножения, +, - выше приоритет, чем у ==, ||, !=, !
??
а у оператора == выше приоритет, чем у || | |
|
|
|
|
|
|
|
для: NSDaler
(05.06.2010 в 11:25)
| | так ведь? | |
|
|
|
|
|
|
|
для: NSDaler
(05.06.2010 в 11:25)
| | У операций деления, умножения, +, - выше приоритет, чем у ==, ||, !=, !
а у операции == выше приоритет, чем у ||
а у всех перечисленных приоритет выше чем у операции = | |
|
|
|
|
|
|
|
для: NSDaler
(05.06.2010 в 11:21)
| | $X = 2 потому что 12/6 это 2 которое присваивается переменной $X, и 2 == 2 - истинно | |
|
|
|
|
|
|
|
для: Valick
(05.06.2010 в 11:26)
| | Валик, вы ошибаетесь. | |
|
|
|
|
|
|
|
для: 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. | |
|
|
|
|
|
|
|
для: sim5
(05.06.2010 в 11:25)
| | Х в данном случае всегда будет равен 1
??
может $X всегда будет равно 2, а условие всегда будет ИСТИНА (true,1) | |
|
|
|
|
|
|
|
для: Valick
(05.06.2010 в 11:28)
| | Вы опять заблуждаетесь:
12/6==2, это условие | |
|
|
|
|
|
|
|
для: sim5
(05.06.2010 в 11:34)
| | $X=(12/6==2) или все таки ($X=12/6)==2
___
угу проверил... первое | |
|
|
|
|
|
|
|
для: Valick
(05.06.2010 в 11:40)
| | Вот что дурковать-то, лень запустить Денвер и посмотреть, что вы получите?
Дано условие (!) 12/6==2. Компьютер будет вычислять:
12 поделит на 6, получит 2
сравнит, равен ли результат 2
2 = 2, значит в результате получаем ИСТИНУ и возвращаем ее (флаг Zero, сброшен).
Истина, это 1, булево значение true. Не верите, проверьте: echo true; | |
|
|
|
|
|
|
|
для: sim5
(05.06.2010 в 11:46)
| | Ну не прав ну и что? Просто я не полагаюсь на приоритеты по умолчанию и мне не лень расставить скобки
Моя вина здесь лишь в том что я не полез в мануал перед тем как ответить на вопрос | |
|
|
|
|
|
|
|
для: Valick
(05.06.2010 в 11:51)
| | И зачем в данном случае надо расставлять скобки? Можно пудумать, что ($X=12/6)==2 даст результат отличный от 1. | |
|
|
|
|
|
|
|
для: sim5
(05.06.2010 в 11:55)
| | я все таки не поленился запустить Денвер :)
$X будет равно 2, а вот против того что условие будет выполняться в любом случае я никогда и не спорил | |
|
|
|
|
|
|
|
для: Valick
(05.06.2010 в 11:57)
| | Ну вот опять 25, не будет он равен 2. | |
|
|
|
|
|
|
|
для: sim5
(05.06.2010 в 12:03)
| | проверяли?
<?
if(($X=12/6)==2) echo $X;
?>
|
| |
|
|
|
|
|
|
|
для: Valick
(05.06.2010 в 12:04)
| | канечно тут X=2
ведь вы сначала к X присваиваете 2 а потом сравниваем 2==2, НО X=2, для того чтобы верно получить, надо так написать
if($X=($X=12/6)==2) echo $X;
|
| |
|
|
|
|
|
|
|
для: NSDaler
(05.06.2010 в 12:08)
| | Ну вы мудрец! Вы думаете, что процессор разделит 12 на 6, вернет это значение интерпретатору, тот присвоит его Х, затем запросит опять процессор сравить Х с двойкой?
Как бы не так - 2, это промежуточный результат и гонять его туда-сюда накладно и не выгодно. 2 как рузультат певого вычисления хранится в аккумуляторе, и процессор продолжит выполять команды далее (конвейер команд), так как вычисление еще не закончилось, и так пока не будет вычислено все выражение, и его рузультат в конечном итоге будет присвоен Х.
А вот если это выражение записать так (виден смысл общей операции):
<?
if(12/6==2 || 12%5 != 0 && 12%2 == 0)
|
то интрепретатору достаточно проверить только истину первого выражения, ибо за ним следут условие логического ИЛИ - если будут истина, то дальнейшее вычисление он остановит, иначе будет продолжать.
PS. Вернее, это уже сами процессоры могут делать - предсказывать ветвление в зависимости от результата операций. | |
|
|
|
|
|
|
|
для: sim5
(05.06.2010 в 12:16)
| | >и так пока не будет вычислено все выражение, и его рузультат в конечном итоге будет присвоен Х.
чушь.
Операция присваивания - часть выражения.
Невозможно вычислить всё выражение, не выполнив присваивания, как одной из операций, это выражение составляющих.. | |
|
|
|
|
|
|
|
для: Trianon
(05.06.2010 в 13:23)
| | Даже так? Стек для этого существует - результат первого выражения в стек, вычислили второе, извлекли из стека и сравнили, и т.д.. А вообще, нынешние процессоры загружают в память комманд гораздо больше, нежели это просто выражение, просто в данном случае интерпретатор выполняет строки.
Если бы процессоры вычисляли так, как вы хотите, играть бы вам до сих пор на них в Тетрис, не более. ) | |
|
|
|
|
|
|
|
для: sim5
(05.06.2010 в 13:28)
| | Для того чтобы конструктивно обсуждать, что происходит, нужно отвлечься и от регистров , и от стека , и от вершины стека выражения, отображенной на набор свободных регистров генератором кода, и вспомнить о грамматике.
Процессоры вычисляют выражения так, как хочет генератор кода с оптимизатором.
К пониманию того, как выражение следует интерпретировать, этот аспект имеет отношение, конечно, но весьма слабое.
PS. Таки да, весьма слабое. Хотите этого Вы - Вы лично. Или не хотите.
PPS. Кстати, тупой код, построенный примитивным генератором чисто по грамматике безо всякой оптимизации (если он компилированный, или хотя бы шитый) - весма шусёр, как ни странно.
Основная потеря производительности идет на интерпретации. Но у нас то на старте треда - С.
Так что. | |
|
|
|
|
|
|
|
для: 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:46)
| | *** Примечание: флаг Zero, установлен. )) | |
|
|
|
|
|
|
|
для: sim5
(05.06.2010 в 11:57)
| | спасибо вам огромное, вроде бы простая тема, а в заблуждение вводит =)))
вот к зачету все вспомнил=) | |
|
|
|
|
|
|
|
для: NSDaler
(05.06.2010 в 12:03)
| | Да ничего в этом блуждающего нет, если знать приоритеты и логику. | |
|
|
|