目の前に僕らの道がある

勉強会とか、技術的にはまったことのメモ

(NULL == NULL) returns ???

ネタです。rubyで返り値にnilを期待している時にhoge == nilと書いたのが少し気持ち悪かったので、ほかの言語ではどういう扱いなんだろうかとふと調べてみました。

C

% cat << __END_OF_C__ > a.c && gcc a.c && ./a.out; rm a.out a.c

#include <stdio.h>

int main (void) {
    if (NULL == NULL) {
        printf("NULL == NULL\n");
    }
    else {
        printf("NULL != NULL\n");
    }
    printf("%d\n", (NULL == NULL));

    return (0);
}

__END_OF_C__
NULL == NULL
1

Python

% cat << __END_OF_PYTHON__ | python

if None == None:
    print('None == None')
else:
    print('None != None')

print(None == None)

__END_OF_PYTHON__
None == None
True

Ruby

% cat << __END_OF_RUBY__ | ruby

if nil == nil then
  puts 'nil == nil'
else
  puts 'nil != nil'
end
puts (nil == nil)

__END_OF_RUBY__
nil == nil
true

Perl

% cat << __END_OF_PERL__ | perl

use strict;
use warnings;

if (undef == undef) {
    print 'NULL';
}
else {
    print 'NOT NULL';
}

__END_OF_PERL__
Use of uninitialized value in numeric eq (==) at - line 5.
Use of uninitialized value in numeric eq (==) at - line 5.
NULL

perlだと数値比較だと==、文字列比較だとeqを使うんですが、undefはそのいずれでもないので、undef同士の比較はできないです(たぶん)。
それより、warn吐いているのに演算結果がTrueな理由が気になる。

                            • -

ふむー。なんとなく気持ち悪いですけど、NULL == NULL returns Trueなんですね。ふむー。