2019年7月19日金曜日

開発環境

について、自然に感じて、不自然さがピンとこなかったからJavaScript以外の言語でも試してみた。

まずはJavaScript(Node.js)

コード

var a = 1;

function foo() {
    a = 2;
    return 0;
}
console.log(a);
a |= foo();
console.log(a);

入出力結果(Bash、cmd.exe(コマンドプロンプト)、Terminal、Jupyter(IPython))

$ node sample.js
1
1
$

Python 3

#!/usr/bin/env python3
a = 1


def foo() -> int:
    global a
    a = 2
    return 0


print(a)
a |= foo()
print(a)

入出力結果(Bash、cmd.exe(コマンドプロンプト)、Terminal、Jupyter(IPython))

$ ./sample.py
1
1
$ 

Perl

コード

#!/usr/bin/env perl

my $a = 1;

sub foo {
    $a = 2;
    0;
}
print $a . "\n";
$a |= foo();
print $a . "\n";

入出力結果(Bash、cmd.exe(コマンドプロンプト)、Terminal)

$ ./sample.pl
1
2
$ 

Go

package main

import "fmt"

var a = 1

func foo() int {
 a = 2
 return 0
}

func main() {
 fmt.Println(a)
 a |= foo()
 fmt.Println(a)
}

入出力結果(Bash、cmd.exe(コマンドプロンプト)、Terminal)

$ go run sample.go
1
2
$ 

C言語

#include <stdio.h>

int a = 1;

int foo() {
  a = 2;
  return 0;
}

int main() {
  printf("%d\n", a);
  a |= foo();
  printf("%d\n", a);
}

入出力結果(Bash、cmd.exe(コマンドプロンプト)、Terminal)

$ cc sample.c && ./a.out 
1
2
$ 

JavaScriptと同様に出力が1、1なのはPython。その他、Perl、Go、Cの出力は1、2。ということで、どちらが自然ということはないみたい。普段Pythonで書くことが多いからたまたま自然に感じただけかも。

出力が1、1となる言語は最初に書いた通り、

  1. a |= foo()
  2. a = a | foo()
  3. a = 1 | foo()
  4. a = 1 | 0 // a = 2
  5. a = 1 | 0
  6. a = 1
という評価の順番で、出力が1、2となる言語は、
  1. a |= foo()
  2. a |= 0 // a = 2
  3. a = a | 0
  4. a = 2 | 0
  5. a = 2
っていう順番で評価されるってことかな。

0 コメント:

コメントを投稿