静的ローカル変数を通じて C、C++、C#、Java、PHP の特性を確認する
0 問題の起源
この問題についての考えは、オブジェクト指向設計におけるシングルトン設計パターンの実装に由来しています。
C++ でシングルトン モードを実装するための標準コードは次のとおりです:
#include <stdio.h>int init(){ printf("init()\n"); return 22;}int GetTheOnly(){ static int x = init(); return x;}int main(){ int only = GetTheOnly(); return 0;}
インスタンス関数 GetTheOnly() で、ユーザーは一意のインスタンスを静的ローカル変数に格納し、init() 関数を直接使用して動的に初期化します。それは初期化中に行われます。
とてもシンプルに見えますが、同じコードを C としてコンパイルすることはできません static int x = init() 行をコンパイルすると、コンパイラはエラーを報告します:
エラー: 初期化子要素は定数ではありません
It C 言語の静的ローカル変数には、初期化時に定数値を割り当てる必要があることがわかります。これは、初期値がコンパイラーによって決定される必要があることを意味します。
関数を呼び出して静的変数を初期化するには、C++ が init(); を 1 回だけ実行するようにする必要があります。この目的を達成するには、C++ コンパイラは、static int x = init(); に対して考えられる追加のコードを追加する必要があります。コンパイラが密かに冗長なアセンブリコードを生成しました。その結果、C++ は使いやすいですが、理解するのは簡単ではありません。
次に、他の言語がこの問題をどのように処理するかを確認したいと思い、C#、Java、PHP を使用して同様の実験を行い、小さな結論に達しました。
1 C# と Java は静的ローカル変数をまったくサポートしません
どちらも静的メンバー変数のみをサポートし、関数内の静的ローカル変数はサポートしません。考えてみれば当然のことですが、静的ローカル変数はほとんどの場合、静的メンバー変数に置き換えることができます。C# テスト コード:
static int x; static char flag = 0; if(flag == 0){ x = init();
flag = 1; } return x;
PHP テスト コード:
りー
3時'時計思考静的ローカル変数の非常に小さな言語の詳細を通じて、これらの言語の特徴を発見することができます。
C++ コンパイラーは、ユーザーにより多くの言語機能を提供しようとする、勤勉で包括的な万能ツールです。ただし、これを行うには、ユーザーのためにコードを秘密裏に生成する必要があり、これが C++ 言語と「氷山効果」。 (C++ の多重継承、スタック上のオブジェクト、コピー構造を考えてください...)
Java と C# は使いやすさに重点を置き、曖昧さを避け、同じ関数に対してユーザーに正しい選択肢を 1 つだけ提供します。 (単一継承、オブジェクトはヒープ上でのみ作成可能、ガベージ コレクションについて考えてください)
C は常にその単純さ、効率性、透明性を維持しており、コンパイラーは正直で誠実であり、基本的にいつ生成されるアセンブリを予測できます。コードが表示されます。
PHP の構造部分は C の構文を模倣しているため、多くの機能が C に似ていますが、結局はインタープリター言語であり、特に変数名やクラス名などはそれ自体がインタープリター言語として使用できます。変数の特徴を利用できるため、信じられないほど柔軟になります。オブジェクト指向部分は Java の構文を模倣しながら、インタプリタ型言語の特性を完全に体現しています。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











C# を使用した Active Directory のガイド。ここでは、Active Directory の概要と、C# での動作方法について、構文と例とともに説明します。

C# データ グリッド ビューのガイド。ここでは、SQL データベースまたは Excel ファイルからデータ グリッド ビューをロードおよびエクスポートする方法の例について説明します。

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

C# での Web サービスのガイド。ここでは、C# での Web サービスの概要について、テクノロジの使用、制限、例を交えて説明します。

Java をシンプルに: プログラミング能力の初心者向けガイド はじめに Java は、モバイル アプリケーションからエンタープライズ レベルのシステムに至るまで、あらゆるもので使用される強力なプログラミング言語です。初心者にとって、Java の構文はシンプルで理解しやすいため、プログラミングの学習に最適です。基本構文 Java は、クラスベースのオブジェクト指向プログラミング パラダイムを使用します。クラスは、関連するデータと動作をまとめて編成するテンプレートです。簡単な Java クラスの例を次に示します。 publicclassperson{privateStringname;privateintage;

Java は、初心者と経験豊富な開発者の両方が学習できる人気のあるプログラミング言語です。このチュートリアルは基本的な概念から始まり、高度なトピックに進みます。 Java Development Kit をインストールしたら、簡単な「Hello, World!」プログラムを作成してプログラミングを練習できます。コードを理解したら、コマンド プロンプトを使用してプログラムをコンパイルして実行すると、コンソールに「Hello, World!」と出力されます。 Java の学習はプログラミングの旅の始まりであり、習熟が深まるにつれて、より複雑なアプリケーションを作成できるようになります。
