熱血エンジニアのメモ用紙

手を動かして理解したこと / 技術メモ を残していくブログ

言語仕様の違いをまとめてみた

C, C++, C#, Python の言語仕様の違いをなんとなくまとめてみました.
というのも, Udacity のコース内で PythonC++ を学習するという流れの説明の際に Syntax は慣れた言語と比較して覚えると良いとの助言があり, 確かに!と思ったからです. この記事では, C, C++, C#, Python で言語ごとに仕様が異なる部分についてまとめます.

ライブラリ

C / C++

#include <libraryname>

  • 主にヘッダーファイル
  • <libraryname> で記載すると, 標準ライブラリを想定. コンパイラオプションや環境変数で指定されるパスを優先して検索.
  • "libraryname" で記載すると, ソースファイルのあるパスを優先して検索.

C#

Python:

import modulename
import packagename.modulename
from packagename import modulename

  • モジュール
    • 関数ライブラリのようなもの.
    • モジュール内スコープで有効なグローバルな変数を定義可. モジュール外からは modulename.variablename でアクセスも可能(非推奨).
    • ファイル単位で1つのモジュールとなる.
  • パッケージ
    • クラスライブラリのようなもの.
    • パッケージ内に複数のモジュールを持つ.
    • ファイル単位で1つのパッケージとなる.
    • あるディレクトリをパッケージが存在するディレクトリとして認識させるためには __init__.py ファイルを置く必要がある.

名前空間 / スコープ / アクセス修飾 etc.

C

名前空間 / スコープ

  • ブロックスコープ
    • ブロック内のみ有効.
  • ローカルスコープ
    • ローカル変数. スコープは関数内に限定.
  • ファイルスコープ
    • グローバル変数.
    • 普通ではファイル内にスコープは限定される.
    • ただし, extern をつけて同じ名前で宣言すれば他のファイルからも参照できる.
  • 静的変数
    • プログラム開始から終了まで 1 つのオブジェクトとして記憶される.
    • static をつけて宣言する.
    • 確実にファイル内のみにスコープが限定される.

アクセス修飾

N/A

C++

名前空間 / スコープ

  • ブロックスコープ
    • ブロック内のみ有効.
  • ローカルスコープ
    • ローカル変数. スコープは関数内に限定.
  • クラススコープ
  • ファイルスコープ(名前空間スコープ)
    • グローバル変数.
    • 普通ではファイル内にスコープは限定される.
    • ::variable とスコープ演算子を使うと, 他のファイルからも参照できる.
  • 名前空間
    • ファイル単位で名前空間を形成する.
    • 参照方法
/*
--- 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#

名前空間 / スコープ

  • C++ と同様
  • クラス定義は partial をつければファイルを跨げる
  • 名前空間はファイルを跨げる
  • 名前空間の利用法は同じ.
  • 名前空間は階層構造を持てる.
// 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