CとJavaScriptの違いは何ですか?

Jun 16, 2021 am 10:21 AM
C言語 javascript

違いは次のとおりです: 1. C 言語は機械語にコンパイルされるのに対し、JS はインタプリタによってスクリプトとして解釈および実行されます; 2. C 言語ではプログラマが手動でメモリを管理する必要がありますが、JS メモリはインタプリタ. 管理する; 3. C言語はシステムAPIを呼び出すことでマルチスレッドを実現しますが、JSはシングルスレッドです。

CとJavaScriptの違いは何ですか?

このチュートリアルの動作環境: Windows7 システム、JavaScript バージョン 1.8.5、Dell G3 コンピューター。

1. C 言語は主に機械語にコンパイルされますが、JavaScript は主にインタプリタによって解釈されスクリプトとして実行されます;

2. C 言語ではプログラマーが手動でメモリを管理する必要があります (主にJavaScript のメモリはインタプリタによって管理されますが、JavaScript のメモリはインタプリタによって管理されます;

3. JavaScript は動的に型付けされた言語であり、変数のデータ型は実行時に変更される可能性があります;

4. JavaScript の関数は、定義時にアクセスできる変数を持つクロージャを形成します;

5. 「クラス継承とポリモーフィズム」などのオブジェクト指向機能のサポート、および JavaScript はプロトタイプ チェーンとクロージャを使用できます。オブジェクト指向の継承、ポリモーフィズム、カプセル化などを実装 ECMAScript 2015 以降を実装する JavaScript は文法レベルでのクラス定義をサポート;

6. C 言語はシステム API を呼び出すことで複数の機能を実現できます。 JavaScript は主にシングルスレッドであるのに対し、JavaScript はマルチスレッドによってブロック操作 (主に IO) 中の CPU 使用率を改善できます。JavaScript の可能なブロック操作は、JavaScript ランタイムによって提供される非同期 API によって完了します

学生向けC の基礎があれば、js の学習は非常に簡単で、構文も似ています。ここでは主に 2 つの類似点と相違点をリストします。基本的に、これらの類似点と相違点を覚えていれば、js を使い始めることができます。わずか数日、あるいは 1 日の学習で、js を使用して Baidu マップを呼び出し、3 次元モデルやその他の楽しい機能を QT で描画できるようになります。

QT の開発プロセスでは、フロントエンドの 3 点セット (CSS/HTML/JS) とよく似た qss、qml、js がよく使用されます。 JSの構文。

C 言語の関数ポインタの概念は JS にも適用できます。ただし、JS の関数ポインタはコンパイル レベルではなく、解釈レベルです。基礎となる実装は異なりますが、使用方法は次のとおりです。同じ。

0. 【変数宣言】 C言語では変数を宣言してから使用する必要がありますが、JSでは宣言せずに直接使用することも可能です もちろん、宣言してから使用することや、使用してから宣言することも可能です。

1. 【代入と参照代入】 jsで変数に値を代入する場合、コピー代入という基本型を除いて、「その他」はすべて代入参照になります(いわゆる「その他」は実際には JS のオブジェクト変数)。 C 言語での代入は、参照を割り当てるように明示的に指定しない限り、コピー代入です。

2. [コールバック] どちらもコールバック関数という概念があり、関数名がコールバック変数名となりますが、これはCでもJSでも同様です。

3. [自称]。 JSでは関数定義時にすぐに呼び出すことができます。構文は次のとおりです。

无参函数示例
(function fooA (){
            //这里是函数体
        })();
有参函数示例:
(function fooB(var a){
            //这里是函数体
        })(5);
ログイン後にコピー

は関数全体を定義し、括弧 A で囲んで (これは関数の関数ポインターを取得するのと同じです)、その後括弧 B を追加します (これはこれを実行するのと同等です)関数)、次の括弧 B を使用してパラメータを入力できます。また、ここでの関数名は省略可能です。

4. 【関数内での関数定義】 JSでは関数内で関数を定義することができます。

5. [終わり]

この概念は比較的新しいもので、C/C で見たことがありません。JS チュートリアルを読むと、これは非常に単純であることがわかりましたが、簡単に言うと、このプログラミング手法を使用すると、関数にローカルの静的変数を持たせることができます。

一般的に、JS の変数のスコープは C と一致しています。関数内の変数には、関数の仮パラメータまたは戻り値を使用してローカル変数を置き換えない限り、関数の外部からアクセスすることはできません。を外部に移動することで、関数の外のコードがポインタを介して特定の関数内のローカル静的変数を操作できるようになります。同様に、この手法は JS にも存在し、その名前はクロージャです。違いは、C は関数からローカル静的変数へのポインターをスローするのに対し、JS はこのローカル変数を操作できる関数へのポインターをスローすることです。

比較のために、「closure」の C 言語バージョンを次に示します。

uint8_t *getBuf(void)
{
    static uint8_t buf[1024];
    return buf;
}

void sendCmd()
{
    uint8_t *cmdBuf = getBuf(void);
    cmdBuf[0] = 0xA5;
    cmdBuf[1] = 0xFF;
    ....
    send(cmdBuf, 10);
}
ログイン後にコピー

getBuf 関数にはローカルの静的配列 buf があり、元のプログラムの他のコードからはアクセスできません。ただし、関数の戻り値を使用して最初のアドレスを送信することで、外部コードによる配列へのアクセスを実現します。たとえば、sendCmd 関数はこの配列を使用します。

以下は JS バージョンです:

シナリオ (1): 関数 A で変数 a と関数 B が定義されています。明らかに B は a にアクセスできます。A の外部のコードにアクセスさせるにはどうすればよいですか。それは? はどうですか?アイデアは 2 つあり、1 つは a への参照を返すというもので、もう 1 つはクロージャです。参照を返すことについては説明しません。なぜなら、 a のメモリは A の実行後に解放され、 a を返す参照は a にアクセスできないからです。

var aRef = (function A(){
            var a = 2;
            return function B(){
                return a++;
            }
            })();

alert(aRef());
alert(aRef());
ログイン後にコピー

上記のコードの効果は、内容として数値 2 を含むプロンプト ボックスをポップアップし、その後、内容として数値 3 を含むプロンプト ボックスを再度ポップアップすることです。関数名Aと関数名Bの両方を記述する必要はありません。

我们来分析一下上述代码,首先函数A是个自调用函数(也可以不自调用,后面有例子),所以A里面变量a立即被赋值为2,函数A的返回值为函数B的函数指针,所以变量aRef就是个函数指针,以后调用aRef( ),就相当于调用了函数B( )。而B( )的返回值为a++。按照JS的设计机制,这种情形下的变量a将会常驻内存,这就是实现了让函数A拥有局部静态变量,而这个局部静态变量,只能被A返回的函数指针(也即函数B)修改。

基于上述分析,我们可以把上述代码改成这样,更容易阅读:

var aRef = (function A(){
            var a = 2;            
            function B(){
                return a++;
            }
            return B;
            })();

也可以改成这样:
function A(){
    var a = 2;            
    function B(){
        return a++;
    }
    return B;
}
var aRef = A();//A没有进行自调用,只能在这里调一次,才能获取到B的函数指针
ログイン後にコピー

情形2:经典的JS定时器闭包。题目:使用for循环,每秒打印出for当前的值。

错误写法:

for(var i = 1; i <= 5; i++)
{
    setTimeout(function(){
        alert(i);
    }, 1000);
}
ログイン後にコピー

执行的效果是,连续弹出5次数字5,而不是预想的依次弹出12345。原因是,第一次执行定时器的回调函数前,i的值就已经变成5了,后续4次定时回调,i的值也是5.

正确写法:

for(var i = 1; i <= 5; i++)
{
    (function(a){
        setTimeout(function(){alert(a);}, 1000);
    })(i);
}
ログイン後にコピー

这里使用了一个匿名的自调用函数(为了叙述方便,我下面称之为out函数),在函数内部又声明了匿名的定时器回调函数(为了叙述方便,我下面称之为in函数),因此使得in函数成了闭包函数,从而使得out函数的局部变量a常驻内存了。

为了更清楚de看明白它的原理,我们再把这段代码改成这样,增强可读性:

function outFunc(a){
    function inFunc(){
        alert(a);
    }
    setTimeout(inFunc, 1000);
}

for(i = 0; i < 4; i++)
{
    outFunc(i);
}
ログイン後にコピー

这段代码看起来清晰了,可以一目了然地看出其中的闭包语法。

总结一下闭包就是:一旦执行了闭包函数所在的外部函数,那么这个外部函数所维护的局部变量,将会常驻内存。

最后来一个实例应用,看看闭包在实际场景中是如何应用的。题目:有如下C语言函数,请把它改成js版。

uint32_t readVol(void)
{
    static uint8_t callCnt = 0;
    callCnt++;
    return callCnt;
}
ログイン後にコピー

这个C函数的功能很简单,就是每次调用时,会返回该函数被调的次数,也即readVol这个函数拥有自己的局部静态变量。用js实现如下:

    var readVol = (function ()
	{
		var callCnt = 0;
		return function()
		{
			callCnt++;
			return callCnt;
		}		
	})();
ログイン後にコピー

这个readVol函数与C语言的readVol函数功能完全一致。

【推荐学习:javascript高级教程

以上がCとJavaScriptの違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

C言語でのtypedef構造体の使い方 C言語でのtypedef構造体の使い方 May 09, 2024 am 10:15 AM

typedef struct は、構造体の使用を簡素化するために構造体型のエイリアスを作成するために C 言語で使用されます。構造体の別名を指定することで、新しいデータ型を既存の構造体に別名付けします。利点としては、可読性の向上、コードの再利用、型チェックなどが挙げられます。注: エイリアスを使用する前に構造体を定義する必要があります。エイリアスはプログラム内で一意であり、宣言されているスコープ内でのみ有効である必要があります。

C言語のstrcpyとstrcatの違い C言語のstrcpyとstrcatの違い May 08, 2024 pm 01:03 PM

strcpy は文字列を別の文字列にコピーし、strcat は文字列を別の文字列に追加します。主な違いとしては、目的の違い、dst パラメータの処理の違い、セキュリティ上の考慮事項の違いなどが挙げられます。

C言語で実数は何を意味しますか C言語で実数は何を意味しますか May 09, 2024 pm 12:06 PM

real は、C 言語で倍精度浮動小数点数を表すために使用されるデータ型で、8 バイトを占有し、小数点以下 15 桁程度の精度を持ち、範囲は [-1.7976931348623157e+308, 1.7976931348623157e+308] です。

_C言語での複雑な使い方 _C言語での複雑な使い方 May 08, 2024 pm 01:27 PM

複素数型は、C 言語で実数部と虚数部を含む複素数を表すために使用されます。その初期化形式は complex_number = 3.14 + 2.71i で、実数部は creal(complex_number) を通じてアクセスでき、虚数部は cimag(complex_number) を通じてアクセスできます。この型は、加算、減算、乗算、除算、剰余などの一般的な数学演算をサポートします。さらに、cpow、csqrt、cexp、csin など、複素数を処理するための一連の関数が提供されています。

C言語でべき乗関数を実装する方法 C言語でべき乗関数を実装する方法 May 09, 2024 pm 11:33 PM

C 言語では、べき乗演算を実装する方法が 2 つあります。 pow() 関数を使用して、最初のパラメーターの 2 番目のパラメーターのべき乗を計算します。カスタム累乗関数を定義します。これは再帰的または反復的に実装できます。再帰的メソッドは、累乗が 0 になるまで 2 倍にし続けます。反復法では、ループを使用して基数を 1 つずつ乗算します。

C言語のscanfでエラーが発生した場合の対処方法 C言語のscanfでエラーが発生した場合の対処方法 May 09, 2024 am 11:39 AM

C 言語では、scanf 関数のエラーを処理する方法は次のとおりです。 1. フォーマット文字列を確認する、 3. 戻り値を確認する、 5. エラー処理関数を使用する、 6. を使用する。カスタムエラーに対処します。エラーを防ぐには、正しいデータ型を使用し、入力を慎重に検証し、戻り値を確認し、プログラム内の潜在的なエラーを処理します。

C言語でのrestrictの使い方 C言語でのrestrictの使い方 May 08, 2024 pm 01:30 PM

strict キーワードは、変数にはポインターによってのみアクセスできることをコンパイラーに通知するために使用され、未定義の動作を防止し、コードを最適化し、読みやすさを向上させます。複数のポインターが同じ変数を指している場合の未定義の動作を防止します。コードを最適化するために、コンパイラは、restrict キーワードを使用して変数アクセスを最適化します。変数にはポインターによってのみアクセスできることを示すことで、コードの可読性が向上します。

_C言語でブールとはどういう意味ですか? _C言語でブールとはどういう意味ですか? May 08, 2024 pm 01:33 PM

_Bool は C 言語のブール型を表し、true または false の 2 つの値のみを含む単純なデータ型で、通常は 1 バイトのメモリを占有し、true または false のみを格納します。 false。偽の値。

See all articles