開発環境
- macOS Mojave - Apple (OS)
- Emacs (Text Editor)
- Windows 10 Pro (OS)
- Visual Studio Code (Text Editor)
js の実装ってこれどれも同じ結果なんだろうか。
— mattn@有益情報 (@mattn_jp) 2019年7月19日
var a = 1;
function foo() { a = 2; return 0; }
console.log(a); // 1
a |= foo();
console.log(a); // 1
について、自然に感じて、不自然さがピンとこなかったからJavaScript以外の言語でも試してみた。はい。不自然とまでは思ってないんですが、どこかの js 実装だけ違ってたりしないかなと思ったのでした。
— mattn@有益情報 (@mattn_jp) 2019年7月19日
まずは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となる言語は最初に書いた通り、
- a |= foo()
- a = a | foo()
- a = 1 | foo()
- a = 1 | 0 // a = 2
- a = 1 | 0
- a = 1
- a |= foo()
- a |= 0 // a = 2
- a = a | 0
- a = 2 | 0
- a = 2
0 コメント:
コメントを投稿