言語仕様の違いをまとめてみた
C, C++, C#, Python の言語仕様の違いをなんとなくまとめてみました.
というのも, Udacity のコース内で Python → C++ を学習するという流れの説明の際に Syntax は慣れた言語と比較して覚えると良いとの助言があり, 確かに!と思ったからです.
この記事では, C, C++, C#, Python で言語ごとに仕様が異なる部分についてまとめます.
ライブラリ
C / C++
#include <libraryname>
- 主にヘッダーファイル
- <libraryname> で記載すると, 標準ライブラリを想定. コンパイラオプションや環境変数で指定されるパスを優先して検索.
- "libraryname" で記載すると, ソースファイルのあるパスを優先して検索.
C#
- コンパイラに DLL を指定してコンパイル.
- Visual Studio の場合は参照を追加する.
Python:
import modulename
import packagename.modulename
from packagename import modulename
- モジュール
- 関数ライブラリのようなもの.
- モジュール内スコープで有効なグローバルな変数を定義可. モジュール外からは
modulename.variablename
でアクセスも可能(非推奨). - ファイル単位で1つのモジュールとなる.
- パッケージ
名前空間 / スコープ / アクセス修飾 etc.
C
名前空間 / スコープ
- ブロックスコープ
- ブロック内のみ有効.
- ローカルスコープ
- ローカル変数. スコープは関数内に限定.
- ファイルスコープ
- グローバル変数.
- 普通ではファイル内にスコープは限定される.
- ただし,
extern
をつけて同じ名前で宣言すれば他のファイルからも参照できる.
- 静的変数
- プログラム開始から終了まで 1 つのオブジェクトとして記憶される.
static
をつけて宣言する.- 確実にファイル内のみにスコープが限定される.
アクセス修飾
N/A
C++
名前空間 / スコープ
- ブロックスコープ
- ブロック内のみ有効.
- ローカルスコープ
- ローカル変数. スコープは関数内に限定.
- クラススコープ
- クラスメンバ
- インスタンスメンバ
- ファイルスコープ(名前空間スコープ)
- 名前空間
- ファイル単位で名前空間を形成する.
- 参照方法
/* --- 1 --- using ディレクティブ. ファイル冒頭かクラス内または関数内に配置できる. 名前空間以下の全てにダイレクトアクセスできるようになる */ using namespace Something; // Something 名前空間の全てにアクセス可 A objectA; objectA.Dosomthing(); B objectB; objectB.Dosomthing(); /* --- 2 --- using ディレクティブ. 名前空間のある機能のみにアクセス */ using namespace Something::A; // Something 内の A クラスにアクセス A objectname; objectname.Dosomthing(); /* --- 3 --- 完全修飾. 都度 namespace 付きでアクセス. */ std::cout << "XXXX" << "\n" // 完全修飾で std 名前空間の cout 関数にアクセス
- クラススコープ
- クラスメンバー変数. スコープはクラス内に限定.
- クラス外からは, 変数の場合
InstanceName.Variable
/ ポインタ変数の場合InstanceName->Variable
としてアクセスできる.
アクセス修飾
- public
- 変数/関数はクラス外からアクセス可能.
- public レベルで継承した場合, 基底クラスの public メンバは派生クラスの public メンバとなる.
- private
- 変数/関数はクラス外からのアクセス禁止.
- private レベルで継承した場合, 基底クラスの public メンバが派生クラスの private メンバとなる.
- protected
- 変数/関数はクラス外からアクセス禁止. private のように振る舞う.
- protected レベルで継承した場合, private メンバーも派生クラスからはアクセス可能.
C#
名前空間 / スコープ
// using ディレクティブ using System; // 完全修飾. x = System.Drawing.Image
アクセス修飾
C++ と同様.
Python
名前空間 / スコープ
- 基本的には他の言語と同じ.
- クラス変数, 他の言語でいう static メンバ変数.
# x はクラス変数 class SomeClass(): x = 5 def somothing(): ....
- インスタンス変数
# x はインスタンス変数 class SomeClass(): def __init__(self): self.x = 5 def somothing(): ....
- モジュール, パッケージ 共に
import
で参照できる.
アクセス修飾
- 基本的に public となる.
- private にしたい場合は
__variable / __function()
と接頭にアンダーバー2つを付けて宣言する.
オーバーロード
C | C++ | C# | Python |
---|---|---|---|
不可 | 可 | 可 | 不可 |
標準入出力
C
int x; scanf("%d", &x); // アドレス指定 printf("値は x = %d です.", x); // 変数指定
C++
int x; std::cin >> x; // 変数指定 std::cout << "値は x = " << x << "です." << "\n" //変数指定
C#
int x = Console.ReadLine(); // etc. Consolr.WriteLine("値は x = {0} です.", x)
Python
x = input() print("値は x = %d です." % x) print("値は x = {0} です.".format(x))
論理演算
C | C++ | C# | Python | |
---|---|---|---|---|
AND | && | && | && | and |
OR | || | || | || | or |
NOT | ! | ! | ! | not |