Распространенное слово для “основанной на значении” операции ИЛИ

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

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

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

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

6
задан Norman Ramsey 31 January 2010 в 18:41
поделиться

6 ответов

В версии 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
6
ответ дан 8 December 2019 в 03:53
поделиться

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

1
ответ дан 8 December 2019 в 03:53
поделиться

pkg-config поставляется с собственным набором макросов Autoconf, таких как PKG _ CHECK _ EXIST и PKG _ CHECK _ MODULES . Они задокументированы на странице pkg-config man.

cppunit также поставляется с собственным макросом Autoconf AM _ PATH _ CPPUNIT в файле cppunit.m4 . Так что это, наверное, лучшее место для начала.

-121--3909724-

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

Может быть хорошей идеей создать синтаксический анализатор С первым, так как больше людей на этом форуме смогут вам помочь. Как только он заработает, можно перевести его в код ассемблера. Опять же, больше людей здесь будут знакомы с 8086 язык сборки программирования, чем с MIPS, поэтому может быть хорошей идеей использовать 8086, хотя архитектура CPU не очень хорошая.

-121--3133491-

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

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

3
ответ дан 8 December 2019 в 03:53
поделиться

в C, || - это логическое управление . В PerL это целое число агностическая операция , которая происходит для лечения первого аргумента как логическое значение. Это единственное различие.

0
ответ дан 8 December 2019 в 03:53
поделиться

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

e1 || e2

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

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

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

e1 ? e1 : e2

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

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

!!(e1 || e2)
9
ответ дан 8 December 2019 в 03:53
поделиться

Прочтите здесь .

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

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


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

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

print 99 || 44 печатает "99" в perl

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

8
ответ дан 8 December 2019 в 03:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: