Mokelab Blog

#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を使いたい場面はまず無いと思いますが。。。

本サイトではサービス向上のため、Google Analyticsを導入しています。分析にはCookieを利用しています。