LINUX.ORG.RU

Интересно, почему так

 


1

1

Интересны две вещи: почему этот код работает?! И почему ИИ считает, что этот код содержит синтаксическую ошибку?!

$b=2;
$a=3;
$a = ($a*2)-$b = $b+3;
echo $a;

Я когда-то использовал такую констукцию с подстановкой, даже не сильно задумался, нсколько она правильная, но она работает. В общем то же самое (но ии это тоже считает, конечно же, неправильным, но тем не менее конструкция работает):

$x= $_GET['x']*cos(1)-$y=$_GET['y']*sin(1);
$y= $_GET['x']*sin(1)+$y=$_GET['y']*cos(1);

Алиса начинает что-то писать про цепочки присвоения, но именно эти варианты бракует.

И почему ИИ считает

я тоже считаю, что автор употребил

aol ★★★★★
()

Я вообще не понял идеи. А когда попытался выполнить код, выяснил, что он эквивалентен следующему

$b = 2;
$a = 3;
$a = ($a * 2) - ($b = $b + 3);
PeleWin
()

Интересны две вещи: почему этот код работает?!

А почему не должен? Приоритет операций, присваивание валидно. Что не так? Ну кроме того, что непонятно, зачем так писать, кроме как всех запутать.

Интересны две вещи: […] И почему ИИ считает, что этот код содержит синтаксическую ошибку?!

Нет, вообще не интересно.

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

$b=2; $a=3; $a = ($a*2)-$b = $b+3; echo $a; По шагам так:

  1. В правой части 5 $b+3;
  2. В левой части b получает значение 5.
  3. В левой части ($a*2) = 6 и и минус 5. получем 1 в $a. Что и выдает интерпретатор.

Как я понял в php можно так a = b = c = 3. Может быть, так можно и в C. Но непонятно, почему подстановка выражения тогда считается некорренктеым?!

AnonymUser
() автор топика
Ответ на: комментарий от CrX

Когда-то в 2017 я написал так, и оно работает:

<?php
if (isset($_GET['ok'])) {
$x= $_GET['x']*cos(1)-$y=$_GET['y']*sin(1);
$y= $_GET['x']*sin(1)+$y=$_GET['y']*cos(1);
}
?>



		<style>
			#rotation_martix {
			position: absolute;
			top:  <?=$x+300?>px;
			left: <?=$y+300?>px;
			background-color: #999;
			width: 10px;
			height: 10px;
			}
			</style>



< div id="rotation_martix">
</  div>
<form  method="GET" >
<input type="submit" name="ok" value="ok">
<input type="text" name="x" value="<?=$x?>">
<input type="text" name="y" value="<?=$y?>">
</form>

Но (все) ИИ такую подстановку считает некорректным, я за 9 лет забыл, почему я так написал.

Может, тогда не дошло, что можно написать так:

<?php
/*angle 1 радиан*/
if (isset($_GET['angle']))
$angle=$_GET['angle'];
else
$angle=1;

if (isset($_GET['x']))
$x=$_GET['x'];
else
$x=1;

if (isset($_GET['y']))
$y=$_GET['y'];
else
$y=40;

/*Если нажали ок, то используем матрицу поворота:*/
if (isset($_GET['ok'])) {
$x= $_GET['x']*cos($angle)-$_GET['y']*sin($angle);
$y= $_GET['x']*sin($angle)+$_GET['y']*cos($angle);
}
?>
			<style>
			#rotation_martix {
			position: absolute;
			top:  <?=$x+300?>px;
			left: <?=$y+300?>px;
			background-color: #999;
			width: 10px;
			height: 10px;
			}
			</style>

<div id="rotation_martix">
</div>
<form  method="GET" >
<input type="submit" name="ok" value="ok">
x<input type="text" name="x" value="<?=$x?>">
y<input type="text" name="y" value="<?=$y?>">
angle<input type="text" name="angle" value="<?=$angle?>">
</form>
AnonymUser
() автор топика
Последнее исправление: AnonymUser (всего исправлений: 1)

И почему ИИ считает, что этот код содержит синтаксическую ошибку?!

Вот всегда удивляет такой вопрос. Спроси в поддержке используемого тобой ИИ, ЛОР то тут причём?

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

Когда-то в 2017 я написал так, и оно работает:

Ну написал и написал, молодец.

Я бы так не писал, впрочем — лучше 4 строки вместо двух, зато читаемо и сразу всем понятно. Но прям криминального тут ничего нет.

Но (все) ИИ такую подстановку считает некорректным

Ну считают и считают. Действительно интересный вопрос тут только один: почему тебе не насрать?

Тут вон на ЛОРе некоторые юзеры, даже вполне себе из плоти и крови, и не такую фигню считают. Никто ж не бежит на другую платформу, спрашивать, почему они это делают. Если и правда интересно — выясняют у них (ну или спорят с ними, например). Почему бы не поступить так же, не спросить у самого этого искусственного идиота, если по какой-то непонятной причине это интересует? Можно даже сказать ему, что он дурак, он не обидится, он же железный.

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

Как я понял в php можно так a = b = c = 3

Правильно понял.

Может быть, так можно и в C

Нет, в C нельзя. Но довольно много где можно. В Python например.

Но непонятно, почему подстановка выражения тогда считается некорренктеым?!

Где, какого выражения?

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

Ключевая проблема, если Вы этого ещё не осознали, заключается в том, что однозначно понять, в каком порядке будет выполнено выражение $a = 1 + $b = 2 сложно.

Может быть, оно эквивалентно $a = (1 + $b) = 2 потому что приоритет сложения выше, чем присваивания.

Может быть, оно эквивалентно $a = 1 + ($b = 2) потому что оператор присваивания правоассоциативен.

Может быть, результат зависит от версии PHP или реализации PHP-машины :)

PeleWin
()
Ответ на: комментарий от AnonymUser

Как я понял в php можно так

a = b = c = 3

Можно. Но не нужно. Этим кодом ты вводишь лишнюю путаницу и не получаешь никакого профита. Вообще. Т.е. на ровном месте создал проблему. И на мой взгляд понять это можно без обращения к искуственному идиоту, который просто пересказал тебе то, что по этому поводу думают на всяких форумах.

shell-script ★★★★★
()
Последнее исправление: shell-script (всего исправлений: 1)
Ответ на: комментарий от AnonymUser

но

a=a*2-b=1

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

Я не знаю как там интерпретирует php, но если математику дать к примеру 5=2 или 5=6+9=4 то у него мозг сломается или он спросит учился ли ты в школе. Я просто видел такое присвоение а=с=5, это тоже что а=5 и с=5, но «a*2-b» это не переменная, как ты этому присваиваешь значение? Переменная это ячейка памяти, а не уравнение с двумя неизвестными.

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

Если это так работает, то это худшая форма записи, тем более приравнивать число внутри выражения. Проще сверху объявить чему равно «b», а ниже вычислять чему равно «a».

Наркомания на марше, короче, не надо так.

Собственно наоборот, придумывание форм полностью отвязанных от стандартных норм, вот это действительно наркомания. Любой язык позволяет написать код через одно место, но никто так не делает.

Погуглил, ИИ выдал мне эту возможность для цикла «$a = ($b = 5) + 10» ну тут могу согласиться, так как некоторые языки делают эти переменные локальными, поэтому объявлять их выше значит тащить локальную переменную цикла во внешней области видимости.

AZJIO
()
Последнее исправление: AZJIO (всего исправлений: 4)
Ответ на: комментарий от Dimez

Спроси в поддержке используемого тобой ИИ

Да можно прямо у ИИ и спросить, почему он так считает.

no-such-file ★★★★★
()
Ответ на: комментарий от AZJIO

Цепочка присвоения в общем допустима. Тут уже сказали. Не, я согласен, что выглядит не очень. Так как я сам нашел свой код спустя 9 лет и был в недоумении «а как оно работает»… Я сам забыл. =)

Но гнать всё под стандарт, только потому, что кто-то не понимает - такая практика под вопросом. Так можно посягнуть и на функцию в функции, на ООП и даже на польскую нотацию в математике.

P.S. Проще говоря, не запретишь человеку писать как-то, например, так, если ему очень хочется:

<?php
$str="eroLolleH";
$len=0;
echo substr(strrev($str), 0, -$len=strlen($str)-8);
?>

AnonymUser
() автор топика

Какой ИИ? Даже гугл-поиск в режиме «ИИ» (Gemini облегчённая) пишет, что:

Код технически работоспособный (выполнится без синтаксической ошибки), но с точки зрения логики и читаемости он крайне некорректен. В PHP оператор присваивания = имеет правостороннюю ассоциативность и очень низкий приоритет, поэтому результат $a = 1 исказит ожидаемые вычисления.

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

P.S. Проще говоря, не запретишь человеку писать как-то, например, так, если ему очень хочется:

Так никто никому ничего и не запрещает. Тем более для себя. Но если будешь писать через одно место какой-то публичный код, или при работе в команде, тебе рано или поздно (скорее рано) выскажут всё, что о тебе с твоим «я художник, я таки вижу» думают. И, вероятно, будут правы, по крайней мере если это именно работа в команде, а не просто опенсорс «as is».

А почему для себя желательно тоже писать нормально, ты сам этим тредом продемонстрировал. Потому что если писать нормально, то не будешь через 9 лет находить собственный код и недоумевать, что там вообще делается.

CrX ★★★★★
()
Последнее исправление: CrX (всего исправлений: 2)
b = 2
a = 3
a = (a * 2) - (b := b + 3)
print(a)

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

anonymous
()
Ответ на: комментарий от AnonymUser

А ещё если очень уж хочется написать именно так, а не с предварительным присваиваиванием на отдельной строке, то хотя бы надо пробелы расставить нормально, а не так, что они запутывают. Сравни:

$a = ($a*2)-$b = $b+3;
$a =  $a*2 - $b=$b+3;
$a = ($a*2) - ($b=$b+3);

Все три строчки делают одно и то же

Первый вариант — твой. Он запутывает и вводит в недоумение. Второй уже значительно читаемее, подумать, что там происходит что-то другое, сложнее. Ну а третий — самый понятный, и я бы если уж и писал так (не знаю там, может строчки платные…), написал бы по крайней мере так.

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

В PHP можно так:

<?php

function f() {
return 7;
}
$a=7;
 if ($a == f()) 
echo $a;

?>

Да и в C сравнивать можно результат функции. И все ж хорош тот стиль, что ближе к псевдокоду (а это C89) =)… in my humble opinion (imho)…

Т.е. согласившись с комментаторами, напрашивается мысль, заодно так: «а зачем нам ООП?!».

AnonymUser
() автор топика
Последнее исправление: AnonymUser (всего исправлений: 3)

Интересный кейс. Думающий дипсик не осилил, хотя это очень способная модель.

kaldeon ★★
()

PHP — это ошибка сама по себе. Поэтому любой код на нём является синтаксической ошибкой. Но как-то работает.

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

напрашивается мысль

Нет, не напрашивается. :) Используя ООП тоже можно писать запутанно. А можно и вполне нормально и читабельно.

shell-script ★★★★★
()

Вы чё тут устроили в комментах?))

Правильный ответ: потому что разрабы PHP - наркоманы.

Если вот так написать в Си:

a = b + c = 5;

то вы получите ошибку lvalue required as left operand of assignment.

Потому что правильно пиcать:

a = b + (c = 5);

Я не знал, что первый вариант работает в PHP, потому что в голову бы никогда не пришло писать такую дичь.

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

А LLM считает это ошибкой видимо потому, что авторам туториалов по PHP тоже не пришло в голову, что такая дичь возможна, и это недостаточно общее знание, чтобы конкретная языковая модель его запомнила. (Видимо, модель слабая.)

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

Потому что ИИ галлюцинирует и является специалистом по всему (а значит ни в чём хорошо не разбирается). Но это пока так.

anonymous
()
Ответ на: комментарий от PeleWin

Стандрат надо смотреть. А стандарт прямо определяет порядок операций. Это тебе не сишка с крестами, где UB всюду.

anonymous
()

Не следует считать ИИ истиной в последней инстанции. Конструкция работает? Интерпретатор не ругается? Значит, ИИ ошибается.

yars068 ★★★★★
()
Ответ на: комментарий от yars068
#include <stdio.h>

int main (void) {

int a, b, c;
c = 3;
a = b = c  = c*5;
printf("%d", a);
}

Если бы было нельзя, то как можно было бы вообще что-то написать?! Риторический вопрос…

AnonymUser
() автор топика
Последнее исправление: AnonymUser (всего исправлений: 2)
Ответ на: комментарий от anonymous

А надо ли «наделять» ИИ чем-то вроде сознания?!

Все-таки результат ИИ - результат работы мат. аппарата, схожего с комбинаторным (привет ТерВеру, здравствуй, так сказать, рулетка или подбрасывание монеты =)).

AnonymUser
() автор топика

Интересны две вещи: почему этот код работает?!

Потому что PHP написан колхозниками. В нормальных языках низя присваивать rvalue

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

Ну здрасти, приехали.

Да, криво сформулировал. Как в сабже нельзя. Ты, собственно постом выше всё и расписал.

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

Видимо, модель слабая

Даже облачный думающий deepseek не осилил, хотя это весьма сильная модель. PHP всемогущ.

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

Смешно только на поверхности. А ты попробуй опровергнуть. Не смотря на все достоинства PHP (он современный, работает и т.п.), с точки зрения дизайна он является огромной ошибкой.

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

А вот в чём разница между Си и PHP, если в Си a = b + c = 5; недопустимо, а в PHP - допустимо?

Приоритет у сложения и там и там выше, чем у присваивания.

Присваивание и там и там правоассоциативно.

В чём же разница?

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

В том, что парсер выражений PHP писали наркоманы. Я не знаю, как еще содержательно прокомментировать это.

Присваивание и там и там правоассоциативно.

Сначала работает приоритет, потом ассоциативность.

Если у тебя a = b = c, то это a = (b = c), потому что подряд стоят операторы одного приоритета, и между ними выбор происходит на основе ассоциативности.

А если у тебя a = b + c = 1, то сначала сворачивается нетерминал b + c как более приоритетный, и получается a = (b + c) = 1, а затем a = ((b + c) = 1). Это ясный и предсказуемый механизм. В Си много синтаксических косяков, но парсинг инфиксных форм они не сломали, а вот в PHP зачем-то умудрились сломать.

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

Так это получается, что в документации к PHP у сложения приоритет выше, чем у присваивания, но в реальности - не выше?

Кстати, и с умножением то же самое:

$b = 0;
$a = 2 * $b = 1;
var_dump($a);
var_dump($b);

Результат выполнения команды

int(2)
int(1)
PeleWin
()
Последнее исправление: PeleWin (всего исправлений: 2)
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария