質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

5回答

1916閲覧

C言語では値をまとめて代入できませんが、なにか理由があるのでしょうか?

hogeee

総合スコア27

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

2クリップ

投稿2020/09/21 14:21

編集2020/09/21 14:29

C言語では値をまとめて代入できませんが、これってなにか意味があるのでしょうか?
できたほうが便利だと思うのですが、なぜそうなっていないのでしょうか。

例、

c

1int x[3]; 2 3x = {1, 2, 3}; // エラー

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2020/09/21 14:24

「まとめて」とは?具体的に。
guest

回答5

0

ベストアンサー

直接的に言うならそういう仕様だからです。 配列型を持つものが式中に現れたら (一部の例外を除いて) その配列の先頭要素を指すポインタに型変換されるというルールがあり、配列として解釈されません。 また、代入演算子の左辺に現れることが出来るのは「変更可能な左辺値」であるというルールもあり、質問者の提示した事例はそれにあてはまりません。

C の背景としてはいわば高級アセンブラとでもいうべき用途から出発していて、簡単に大きなコピーが生じるのは好ましくない (意図してやるならそれが目立つべき) という価値観は感じます。 標準ライブラリに memmovememcpy が用意されているので特別に面倒くさいというわけでもないですし。

投稿2020/09/21 15:06

SaitoAtsushi

総合スコア5686

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otn

2020/09/21 15:06

(int[3]){1,2,3} という書き方は出来るが、これは配列じゃなくてポインタになる。
guest

0

言語仕様で決まっている。

それが全てで特に理由や意味は無いと思います。

なぜそうなったのか?というのは、想像するしかありませんが、
変数への代入というのは、言語レベルにのみ存在する仮想の概念で、
実際にはマシン語の世界では、特定メモリへのデータの書き込み、
もしくは、レジスタへのデータの書き込みという形になります。
当然それらは、レジスタのサイズと書き込み命令のサイズ指定に依存しているわけです。
レジスタサイズはそんなに大きくはなく、一般的にはintのサイズと同じなので、
(64bit環境では、intが32bitのままが多いので異なりますが)
普通に考えて作ったら代入は一つずつだろうということかと。
C言語はマシン語に対して非常にシンプルな形をとっている言語ですので。

逆に言えば、複数の値が同時に代入できるようなものは、わざわざそれができるように工夫されているという事です。

投稿2020/09/21 15:12

amiya

総合スコア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
SHOMI

総合スコア4079

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

言語の仕様がそうなってるから、ですね。

投稿2020/09/21 14:33

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問