Общий термин для оператора «на основе значения» ИЛИ - PullRequest
6 голосов
/ 31 января 2010

Просто быстрый вопрос

 printf("%d", 99 || 44) prints "1" in C
 print 99 || 44 prints "99" in perl

Существует два разных вида оценки. У каждого есть имя?

edit: мне интересно знать, как обычно называется эта оценка Perl по сравнению с C. Когда вы говорите «C пример - X, а Perl - не X, а Y», какие слова вы бы использовали для X и Y. "короткое замыкание" это не то, что я ищу.

Ответы [ 6 ]

9 голосов
/ 31 января 2010

Как вы заметили, слова, которые вы ищете, не"короткое замыкание". Оценка короткого замыкания означает, что в выражении

e1 || e2

если выражение e1 оценивается как нечто, представляющее истину, тогда нет необходимости оценивать e2. И C, и Perl используют оценку короткого замыкания.

Мне известно о различии, которое вы делаете в двух разных вариантах короткого замыкания ИЛИ , но за двадцать лет работы на языках программирования я никогда не видел, чтобы эти вещи назывались. Версия Perl довольно популярна на динамических языках, например, Icon, Lua, Scheme.

Версия Perl почти выражается в C:

e1 ? e1 : e2

К сожалению, эта версия может оценивать e1 дважды, в зависимости от оптимизатора - & если у e1 есть побочные эффекты, или если компилятор не может определить, может ли иметь побочные эффекты, компилятор требуется , чтобы оценить его дважды. Этот дефект можно исправить, привязав значение e1 к новой локальной переменной, но для этого требуется расширение GNU.

Поведение C можно эмулировать в Perl с помощью

!!(e1 || e2)
8 голосов
/ 31 января 2010

Читать здесь .

Двоичный || выполняет логическое ИЛИ операцию короткого замыкания . То есть, если левый операнд имеет значение true, правый операнд даже не оценивается. Скалярный или списочный контекст распространяется вниз до правого операнда, если он вычисляется.

В Perl || и && операторы отличаются от C тем, что вместо возврата 0 или 1 они возвращают последнее оцененное значение.


printf ("% d", 99 || 44) печатает "1" в C

Это потому, что 99||44 возвращает true (только 99 (что не равно нулю) оценивается из-за действия короткого замыкания ||), эквивалент которого равен 1, следовательно, printf() печатает 1.

печать 99 || 44 отпечатка "99" в перл

.. вместо возврата 0 или 1 возвращается последнее вычисленное значение (99 здесь).

6 голосов
/ 31 января 2010

В версии C используется || как логическое ИЛИ между двумя значениями. И 44, и 99 оценивают как true в C, поскольку они не 0, поэтому результат ИЛИ между ними возвращает 1 (AKA true в C)

В этом конкретном фрагменте perl, || является оператором слияния нуля , двоичным файлом, который оценивает второй аргумент, если первый равен нулю, в противном случае - первым аргументом. Поскольку 99 является первым аргументом, а не нулевым, он возвращается и печатается.

РЕДАКТИРОВАТЬ: Спасибо Эван за разъяснение: || Оператор в perl не является оператором с нулевым слиянием, он возвращает RHS, если LHS оценивается как false, в противном случае возвращается LHS. // - это «правильный» нуль-коалесцирующий оператор.

Вот список значений в perl, которые оцениваются как ложные ( из википедии)

$false = 0; # the number zero
$false = 0.0; # the number zero as a float
$false = 0b0; # the number zero in binary
$false = 0x0; # the number zero in hexadecimal
$false = '0'; # the string zero
$false = ""; # the empty string
$false = undef; # the return value from undef
$false = 2-3+1  # computes to 0 which is converted to "0" so it is false
3 голосов
/ 31 января 2010

В Perl, 99 || 44 возвращает 99, потому что || является "коротким замыканием", и если его первый аргумент является истинным в логическом контексте, он просто возвращает его print отпечатки 99.

В C логический результат ||, который передается в printf, приводит либо к 1, либо к 0. Это также короткое замыкание, поэтому 44 даже не оценивается.

1 голос
/ 31 января 2010

И C, и Perl ссылаются на свои соответствующие операторы || как «логическое ИЛИ» (в отличие от побитового ИЛИ). Не существует специального имени для поведения Perl, возвращающего последнее значение, в отличие от 0 или 1.

0 голосов
/ 01 февраля 2010

В C || является логической операцией . В Perl это целое число независимая от типа операция , которая обрабатывает первый аргумент как логическое значение Это единственное различие.

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