23

私は常に、C++ が最も強く型付けされた言語の 1 つであると考えてきました。したがって、この論文の表 3 でC++ の型付けが弱いと述べられているのを見て、
私は非常にショックを受けました。

どうやら、

C および C++ は、型キャストにより、整数であった構造体のフィールドをポインターとして解釈できるため、弱い型付けと見なされます。

型キャストの存在はすべて重要ですか? そのようなキャストの明示性は重要ではありませんか?

より一般的に言えば、C++ の型付けが弱いということは本当に一般的に受け入れられているのでしょうか? なんで?

4

5 に答える 5

12

「弱い型付け」はかなり主観的な用語です。私は、 「厳密に型付けされた」および「静的に型付けされた」という用語よりも、 「緩やかに型付けされた」および「動的に型付けされた」という用語を好みます。それらはより客観的で正確な言葉だからです。

私が知る限り、人々は一般的に「弱い型付け」を軽蔑的な用語として使用します。これは、「この言語の型の概念が好きではない」という意味です。これは、特定の言語に対して専門的または技術的な議論を持ち出すことができない人のための一種の論争です

「厳密に型指定された」という用語にも、わずかに異なる解釈があります。私の経験では、一般的に受け入れられている意味は、「型が一致しない場合、コンパイラはエラーを生成する」です。別の解釈は、「暗黙の変換がまったくないか、ほとんどない」というものです。これに基づいて、C++ は実際には厳密に型付けされた言語と見なすことができ、ほとんどの場合、そのように見なされます。C++ に関する一般的なコンセンサス、厳密に型指定された言語であるということです。

もちろん、質問に対してより微妙なアプローチを試みて、言語の一部は厳密に型付けされている (これがほとんどの場合)、他の部分は緩く型付けされている (算術変換や 4 つの型などのいくつかの暗黙の変換) と言うことができます。明示的な変換の)。

さらに、一部のプログラマー、特にいくつかの言語に精通していない初心者は、「厳密」と「静的」、「緩い」と「動的」を区別するつもりがないか、区別できません。そして、限られた経験に基づいて、この 2 つの概念 (そうでなければ直交する概念) を混同します (通常、一般的なスクリプト言語におけるダイナミズムとルーズ タイピングの相関関係など)。

実際には、C++ の一部 (仮想呼び出し) では、型システムが部分的に動的であるという要件が課されていますが、標準の他の部分では厳密である必要があります。繰り返しますが、これらは直交する概念であるため、これは問題ではありません。

要約すると、おそらくどの言語も1 つのカテゴリまたは別のカテゴリに完全に完全に適合することはありませんが、特定の言語の特定の特性が支配的であると言えます。C++ では、厳格さが間違いなく支配的です。

于 2014-11-05T09:48:42.777 に答える
3

対照的に、型の混乱が静かに (検出されずに) 発生し、最終的にローカライズが困難なエラーを引き起こす可能性がある場合、その言語は型付けが弱いと言えます。

たとえば、C++ で発生する可能性があります。

#define _USE_MATH_DEFINES
#include <iostream>
#include <cmath>
#include <limits>

void f(char n) { std::cout << "f(char)\n"; }
void f(int n) { std::cout << "f(int)\n"; }
void g(int n) { std::cout << "f(int)\n"; }

int main()
{
    float fl = M_PI;   // silent conversion to float may lose precision

    f(8 + '0'); // potentially unintended treatment as int

    unsigned n = std::numeric_limits<unsigned>::max();
    g(n);  // potentially unintended treatment as int
}

また、C および C++ は、型キャストにより、整数であった構造体のフィールドをポインターとして解釈できるため、弱い型付けと見なされます。

うーん...暗黙の変換を介していないので、それはばかげた議論です。C++ では型間の明示的なキャストが可能ですが、それはほとんど「弱い」ものではありません。上記のサイト独自の定義で必要とされるように、偶発的またはサイレントに発生することはありません。

型キャストの存在はすべて重要ですか? そのようなキャストの明示性は重要ではありませんか?

明示性は重要な考慮事項です。型に関するコンパイラの知識をプログラマが上書きできるようにすることは、C++ の「強力な」機能の 1 つであり、弱点ではありません。誤って使用する傾向はありません。

より一般的に言えば、C++ の型付けが弱いということは本当に一般的に受け入れられているのでしょうか? なんで?

いいえ、受け入れられないと思います。C++ は適度に厳密に型付けされており、他のポインター型への暗黙的なキャストや、キャスト演算子とコンストラクターによるvoid*よりきめ細かい制御など、歴史的に問題を引き起こしてきた寛大な方法が取り除かれています。explicit

于 2014-11-05T10:13:34.787 に答える
-2

簡単な例を挙げましょう。

 if ( a + b )

C/C+= では、float から int、さらに Boolean への暗黙的な変換が可能です。

厳密に型指定された言語では、このような暗黙的な変換は許可されません。

于 2014-11-05T14:51:40.550 に答える