ホームページ > バックエンド開発 > C++ > 配列を直接代入できないのに、C/C の構造体内では代入できるのはなぜですか?

配列を直接代入できないのに、C/C の構造体内では代入できるのはなぜですか?

Susan Sarandon
リリース: 2024-12-19 22:49:09
オリジナル
459 人が閲覧しました

Why Can't I Assign Arrays Directly, But I Can Within Structs in C/C  ?

配列のメンバーごとの割り当てが構造体内でのみサポートされる理由

一般的な配列とは異なり、構造体内で定義された配列はメンバーごとの割り当てを利用できます。配列を別の配列に代入することは許可されていませんが (__

num1 = num2;//
ログイン後にコピー
)、構造体内では可能になります (
struct1 = struct2;//) ;/pre>__)、示されているように以下:<pre class="brush:php;toolbar:false">int num1[3] = {1,2,3};
int num2[3];
num2 = num1; // "error: invalid array assignment"

struct myStruct { int num[3]; };
struct myStruct struct1 = {{1,2,3}};
struct myStruct struct2;
struct2 = struct1;
ログイン後にコピー

歴史的および哲学的根拠

この相違は C の進化に起因します。初期の反復では、配列は基本的にサイズ情報のないポインターでした。コンパイラに必要なデータが不足していたため、これにより割り当てが妨げられました。それにもかかわらず、構造体内の配列は、外側の構造体から型とサイズの情報を継承するという例外的な処理の恩恵を受けました。その結果、一般的な制約の影響を受けずに、構造体のコンテキスト内でメンバーごとにそれらを割り当てることができました。

この慣行は、最新の C および C に引き継がれ、オープン配列を割り当てる際の実装上の課題を解決する特殊な機能です。一般的な配列割り当てを導入すると、曖昧さと互換性の問題が発生する可能性があります。そのため、制限は維持され、プログラマは明示的な配列コピーに memcpy を使用することが推奨されました。

例外

関数パラメータは、配列メンバーを変更できる別の設定として登場しました。割り当てられました。次のコードを考えてみましょう。
typedef int vec[3];

void f(vec a, vec b) {
    a = b; // pointer assignment
}
ログイン後にコピー

a はポインター パラメーターですが、構造体の外側にあるにもかかわらず、代入により要素ごとのコピーが効果的に実行されます。この例外は本質的に、関数呼び出しでの値のセマンティクスを可能にする拡張機能です。

以上が配列を直接代入できないのに、C/C の構造体内では代入できるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート