Автор Гілка: Яка різниця між = та === (на байтовому рівні, не залежно від мови програмування)  (Прочитано 8219 раз)

gdekjifgb

  • Гість
1 Мені цікаво чому такі питання у мене виникають. А також цікаво чи у вас (тутешніх Чхунту-друзів) виникало таке питання.

Якщо
$x = 0;
//потім
if($x == false) {              //1 порівняння
//умова виконується
}

//а якщо
if($x === false) {            //2 порівняння
//умова НЕ виконується
}


2 Питання (з поясненням): якщо у змінній х записано НУЛЬ, і в першому порівнянні і в другому, то як компілятор чи інтертрипатор :) "розуміє" що конкретно значить $x?

А якщо перейти до байтів, то $x має (вказує на) адресу в пам'яті комп'ютера, і в ній міститься 00h.

« Змінено: 2021-07-23 22:07:09 від gdekjifgb »

Відсутній ysenko

  • Новачок
  • *
  • дописів: 38
  • Карма: +1/-0
  • Python developer
На жаль, ваше запитання, таки залежить від мови програмування. Я не гуру PHP але `==` виконує приведення типів, тобто конвертує значення які порівнюються до одного типу і виконує порівняння, а `===` не виконує приведення типів. І, оскільки типи різні, то оператор `===` повертає false, а оператор `==` - true.

https://www.php.net/manual/en/language.operators.comparison.php
import antigravity

gdekjifgb

  • Гість
На жаль, ваше запитання, таки залежить від мови програмування.
Не знаю. Але я думаю (думав?) що в кожній мові програмування є звичайне порівняння і тренарне порівняння. Може в якихось мовах із жорсткою типізацією такого і нема?

... виконує приведення типів, тобто конвертує значення які порівнюються до одного типу і виконує порівняння, а `===` не виконує приведення типів. І, оскільки типи різні, то оператор `===` повертає false, а оператор `==` - true.

Щоб зрозуміти як воно працює потрібно глянути в php-source, але я в тих справах не розбираюсь.

https://www.php.net/manual/en/language.operators.comparison.php

Знаю і періодично створюю повні дзеркала документації. Інтернет хоч і оптичний (чи оптоволоконний), але раптом щось станеться.
xuser@mbs:~$ ll /var/www/html/
итого 15
drwxr-xr-x 16 root     root    239 янв 24 15:04 ./
drwxr-xr-x  6 root     root     51 июл 16  2020 ../
drwxr-xr-x  3 root     root     18 июл 14  2020 es5/
-rw-r--r--  1 root     root  10918 мая 25  2020 _index.html
drwxr-xr-x  3 root     root     18 фев 20  2020 js/
drwxrwxr-x  3 xuser    xuser    18 янв 24 15:15 jsukr/
drwxrwxr-x  6 www-data xuser    87 июн  9  2019 mbs/
drwxr-xr-x  3 root     root     18 окт 14  2020 mt/
drwxr-xr-x  3 root     root     49 окт  1  2020 mysql/
drwxr-xr-x  3 root     root     18 июл 15  2020 mysqlru/
drwxrwxr-x  7 www-data xuser    79 июл  7 07:45 oop/
drwxrwxr-x  6 www-data xuser    80 дек 23  2019 oop1/
drwxr-xr-x  3 root     root     18 авг 23  2019 php/
drwxr-xr-x  3 root     root     18 окт 14  2020 phpru/
drwxr-xr-x  3 root     root     18 окт 10  2020 re/
drwxrwxr-x  7 www-data xuser   109 окт 20  2019 wcmbs/
drwxr-xr-x  3 root     root     18 окт 14  2020 wr/
xuser@mbs:~$

Значить якщо інтерпретатор зустрічає ===, він виконує щось іще (магію з типами. але як воно конкретно відбувається?). Мені просто (було?) цікаво як $x із значенням 00h може бути і false, і true?

---
благодарствую за відповіді на мої дивні питання

Я не гуру PHP але...
Java?
« Змінено: 2021-07-24 16:07:18 від gdekjifgb »

Відсутній ysenko

  • Новачок
  • *
  • дописів: 38
  • Карма: +1/-0
  • Python developer
Цитата
Не знаю. Але я думаю (думав?) що в кожній мові програмування є звичайне порівняння і тренарне порівняння. Може в якихось мовах із жорсткою типізацією такого і нема?

Так, зазвичай, працюють слабо типізовані мови (не плутати з динамічною типізацією), наприклад JS, який може додати число до рядка і навпаки, автоматично конвертуючи типи.

Цитата
Щоб зрозуміти як воно працює потрібно глянути в php-source, але я в тих справах не розбираюсь.

Не зовсім, сторінка з документацією, на яку я кинув лінк, досить детально розписує як працює == і ===. Єдине чого я не знайшов, то це до якого типу приводяться операнди у вашому прикладі з ==. Логічно припустити, що до типу першого операнда, тобто false конвертується в 0, який порівнюється зі значенням змінної х (або навпаки - x конвертується в bool), що в результаті порівняння повертає значення true.

Цитата
Значить якщо інтерпретатор зустрічає ===, він виконує щось іще (магію з типами. але як воно конкретно відбувається?). Мені просто (було?) цікаво як $x із значенням 00h може бути і false, і true?

Магії немає, == порівнює значення приведені до одного типу, а === повертає false, коли бачить, що типи даних в операндів ліворуч і праворуч різні. Там навіть не доходить до порівняння значень.

Цитата
Java?

Python, JS, Rust, Go - всього потрохи.
import antigravity

gdekjifgb

  • Гість
Магії немає, == порівнює значення приведені до одного типу, а === повертає false, коли бачить, що типи даних в операндів ліворуч і праворуч різні. Там навіть не доходить до порівняння значень.

Ясно, але як воно приводить дані до конкретного типу не ясно.  :laugh:
---
Тему закрито, мабуть?

Axmed

  • Гість
Магії немає, == порівнює значення приведені до одного типу, а === повертає false, коли бачить, що типи даних в операндів ліворуч і праворуч різні. Там навіть не доходить до порівняння значень.

Ясно, але як воно приводить дані до конкретного типу не ясно.  :laugh:
---
Тему закрито, мабуть?

В PHP є функція gettype(), щоб подивитися який тип має значення.

$ php -a
php > $x = (string)0;
php > print gettype($x);
string
php > print gettype($x + 1);
integer
php > print gettype($x + false);
integer
php > print gettype($x == false);
boolean

Оператор + перетворює результат у тип integer.
Оператор == та === завжди перетворює результат у тип boolean.

Крім того, PHP вміє будь-яке значення перетворити в логічний тип.
0 == false, 22 == true
"" == false, "abc" == true

---
Що таке Чхунту? Якесь індіанське племʼя циган? ???
« Змінено: 2021-07-25 02:05:17 від axmed »

Відсутній ysenko

  • Новачок
  • *
  • дописів: 38
  • Карма: +1/-0
  • Python developer
Цитата
Ясно, але як воно приводить дані до конкретного типу не ясно.  :laugh:

Тут є трохи про явне і неявне приведення типів https://www.php.net/manual/en/language.types.type-juggling.php
import antigravity

gdekjifgb

  • Гість
...
В PHP є функція gettype(), щоб подивитися який тип має значення.

$ php -a
php > $x = (string)0;
php > print gettype($x);
string
php > print gettype($x + 1);
integer
php > print gettype($x + false);
integer
php > print gettype($x == false);
boolean

Оператор + перетворює результат у тип integer.
Оператор == та === завжди перетворює результат у тип boolean.

Крім того, PHP вміє будь-яке значення перетворити в логічний тип.
0 == false, 22 == true
"" == false, "abc" == true

 >:( Вище написав що мені цікаво ЯК відбуваються порівнянння/приведення типів (коли і як інтерпритатор дізнається що йому потрібно, і ЯК і  ЩО конкретно відбувається ... ). Але для цього потрібно дивитись у/на php-source.

Я не знущаюсь над форумчанами (і над собою). У мене є інші справи. А запитував - бо інтєрєсно.

У мене буде іще декілька питань, але скоріш за все задам їх в Балачках. Бо своїми заморочками/філософіями розлякую потенційних форумчан.

Ось, мабуть, те що ви пояснювали: https://www.php.net/manual/en/types.comparisons.php

Off-topic:
Що таке Чхунту? Якесь індіанське племʼя циган? ???
Іще коли вас взагалі не було, на сайті був якийсь привид на рожевому поні з копитом рогом на голові. Його аккаунт називався Chulthu. Але я вперше прочитав його як "Чхунту", і завжди називав його саме так. А "Чхунту-друзі" - це тутешні древні давні форумчани.

Тут є трохи про явне і неявне приведення типів https://www.php.net/manual/en/language.types.type-juggling.php
ok

---
ааа, і ето... Не потрібно іще раз повторювати вище/(написане/пописане).
« Змінено: 2021-07-25 10:28:46 від gdekjifgb »