開発環境
- 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 コメント:
コメントを投稿