#49 いろんな言語でtrueに代入してみる
プログラミング言語のクイズで、trueに代入できるかどうかを出題する方がいるようなので、いろんな言語で試してみました。
プログラミング言語C
Cにはbool型が言語レベルでは用意されていないので、次のようにbool型のtrueという変数を宣言しようとするとコンパイルエラーになります。
int main() {
bool true = false;
}
% clang main.c
main.c:4:3: error: use of undeclared identifier 'bool'
bool true = false;
stdbool.h
を使うとbool型とtrue/falseが使えるようになります。さっそく試してみましょう。
#include <stdbool.h>
int main() {
bool true = false;
}
% clang main.c
main.c:4:8: error: expected identifier or '('
bool true = false;
^
/..中略 ../include/stdbool.h:16:14: note:
expanded from macro 'true'
#define true 1
trueは#define true 1
と定義されていて、変数名が1になってしまうのでダメそうです。
C++
C++にはbool型があります。trueに代入してみましょう。
int main() {
bool true = false;
}
% clang main.cpp
main.cpp:2:8: error: expected unqualified-id
bool true = false;
^
1 error generated.
コンパイル時、変数名はunqualified-idでないとダメだよエラーとなりました。
Java
Javaはboolean型です。
public class Main {
public static void main(String[] args) {
boolean true = false;
}
}
% javac Main.java
Main.java:3: エラー: 文ではありません
boolean true = false;
^
Main.java:3: エラー: ';'がありません
boolean true = false;
^
エラー2個
「文になっていない」というコンパイルエラーになりました。trueは予約語だからですね。
PHP
PHPだとTRUE/FALSEですね。
<?php
TRUE = FALSE;
?>>
% php main.php
Parse error: syntax error, unexpected '=' in /.../main.php on line 2
文法エラーとなりました。PHPの場合、変数は$変数名
でした。この場合はどうでしょうか?
<?php
$TRUE = FALSE;
?>>
% php main.php
%
$TRUE
という変数を作って、それに代入するのはアリなようです。
Ruby
Rubyはtrue/falseですね。
#!/usr/bin/ruby
true = false
% ruby main.rb
main.rb:3: Can't assign to true
true = false
「trueには代入できないよ」というエラーが出ました。
Python
PythonはTrue/Falseです。
#!/usr/local/bin/python3
True = False
% python3 main.py
File "main.py", line 3
True = False
^
SyntaxError: cannot assign to True
「Trueには代入できないよ」というエラーが出ました。
JavaScript
まずはChromeのDevTools経由で。
$gt; true = false
Uncaught SyntaxError: Invalid left-hand side in assignment
「代入文の左側が不正だよ」というエラーになりました。
続いてNodeの場合はどうでしょうか?
% node main.js
/Users/fkm/dev/tmp/20201110/main.js:1
true = false;
^^^^
SyntaxError: Invalid left-hand side in assignment
同じエラーですね。というか結果が違うと戸惑う気がします。。。
TypeScript
JavaScriptがエラーにしているので、こちらもエラーにならないと辻褄があわないですね。コード自体はJavaScriptと同じなので省略します。
% tsc main.ts
main.ts:1:1 - error TS2364: The left-hand side of an assignment expression must be a variable or a property access.
1 true = false;
~~~~
Found 1 error.
エラーメッセージが多少親切になっている気がします。
Go
Goもtrue/falseです。
package main
func main() {
true = false
}
% go run main.go
# command-line-arguments
./main.go:4:8: cannot assign to true
「Trueには代入できないよ」というエラーが出ました。
もう1パターン試してみます。
package main
func main() {
true := false
}
% go run main.go
# command-line-arguments
./main.go:4:3: true declared but not used
変数を使っていないよエラーになりました。Goの場合、trueという変数を作ることは可能なようです。
Kotlin
Androidアプリ開発では必須なKotlinではどうでしょうか?Kotlin Playgroundで試してみました。
fun main() {
true = false
}
Variable expected
変数が必要と言われてしまいました。この場合だとどうでしょうか?
fun main() {
val true = false
}
Expecting property name or receiver type
プロパティ名かレシーバー型が必要と言われてしまいました。
Swift
iOSアプリ開発では必須となるSwiftではどうでしょうか?
true = false
Cannot assign to value: literals are not mutable
代入はできなさそうです。ではこの場合は?
let true = false
Keyword 'true' cannot be used as an identifier here
「キーワード'true'は識別子としてここでは使えません」というエラーになりました。
まとめ
いろんな言語でtrueに代入してみました。ほとんどの言語でエラーになりましたが、Goだけ変数名として使えてしまう点は要注意かもしれません。まぁ、変数名にtrueを使いたい場面はまず無いと思いますが。。。