C言語では値をまとめて代入できませんが、これってなにか意味があるのでしょうか?
できたほうが便利だと思うのですが、なぜそうなっていないのでしょうか。
例、
c
1int x[3]; 2 3x = {1, 2, 3}; // エラー
よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
ベストアンサー
直接的に言うならそういう仕様だからです。 配列型を持つものが式中に現れたら (一部の例外を除いて) その配列の先頭要素を指すポインタに型変換されるというルールがあり、配列として解釈されません。 また、代入演算子の左辺に現れることが出来るのは「変更可能な左辺値」であるというルールもあり、質問者の提示した事例はそれにあてはまりません。
C の背景としてはいわば高級アセンブラとでもいうべき用途から出発していて、簡単に大きなコピーが生じるのは好ましくない (意図してやるならそれが目立つべき) という価値観は感じます。 標準ライブラリに memmove
や memcpy
が用意されているので特別に面倒くさいというわけでもないですし。
投稿2020/09/21 15:06
総合スコア5684
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
Cではそもそも、配列のまるごと代入が出来ません。
C
1int a[3]; 2int b[3] = {1,2,3}; 3 4a = b; → エラー
これはポインターの仕様との絡みですね。
構造体なら、まるごとの代入が出来ます。
C
1#include <stdio.h> 2 3typedef struct { 4 int a; 5 int b; 6 int c; 7} foo; 8 9int main() 10{ 11 foo x, y; 12 13 x = (foo){1,2,3}; 14 y = x; 15 16 printf("%d %d %d\n",x.a, x.b, y.c); 17}
投稿2020/09/21 15:01
総合スコア85901
0
言語仕様で決まっている。
それが全てで特に理由や意味は無いと思います。
なぜそうなったのか?というのは、想像するしかありませんが、
変数への代入というのは、言語レベルにのみ存在する仮想の概念で、
実際にはマシン語の世界では、特定メモリへのデータの書き込み、
もしくは、レジスタへのデータの書き込みという形になります。
当然それらは、レジスタのサイズと書き込み命令のサイズ指定に依存しているわけです。
レジスタサイズはそんなに大きくはなく、一般的にはintのサイズと同じなので、
(64bit環境では、intが32bitのままが多いので異なりますが)
普通に考えて作ったら代入は一つずつだろうということかと。
C言語はマシン語に対して非常にシンプルな形をとっている言語ですので。
逆に言えば、複数の値が同時に代入できるようなものは、わざわざそれができるように工夫されているという事です。
投稿2020/09/21 15:12
総合スコア1218
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
なぜそうなっていないのでしょうか
y_waiwaiさんも書かれていますが、そういう仕様だからとしか…
初期化時なら可能です。
C
1int x[3] = { 1, 2, 3 };
C++ならvector
で可能です。
C++
1std::vector<int> v; 2v = { 1, 2, 3 };
投稿2020/09/21 14:46
編集2020/09/21 14:50総合スコア4079
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。