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

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

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

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

Q&A

解決済

3回答

1411閲覧

複数の変数にループで一気に値を代入する方法はありますか?(配列を用いないとしたら)

akamakku

総合スコア191

C

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

0グッド

0クリップ

投稿2015/10/19 06:16

たとえば

C

1 2 int a,b,c,d,e,f,g,h,i,j,k,l; 3 a = 2; 4 b = a + 2; 5 c = b + 2; 6 d = c + 2; 7 e = d + 2; 8 f = e + 2; 9 g = f + 2; 10 h = g + 2; 11 i = h + 2; 12 j = i + 2; 13 k = j +2; 14 l = k + 2; 15

こんな感じである規則に従って一気に代入したいんです。
しかも実際には、a → bは求められるけどb → aは求められないんですが、あとのほう(この例だとlからaの方向に順番に)から参照しなきゃいけないこともあるんで値を残したいんです。(a~lまでを最初に生成して、生成の逆順で参照することがあるんです)

配列しかありませんかね

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

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

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

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

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

guest

回答3

0

可変長引数を使ったfoldl(言語によってはreduceとも言う)もどきを作ることで実現してみました。

C

1#include <stdio.h> 2#include <stdarg.h> 3 4int kisoku(int accs, void *data); 5int foldl(int (*func)(int, void *), int accs, int count, ...); 6int vfoldl(int (*func)(int, void *), int accs, int count, va_list list); 7 8int main(void) 9{ 10 int a, b, c, d, e, f, g, h, i, j, k, l; 11 // kisokuが規則。0は初期値。foldlで左畳み込み 12 foldl(kisoku, 0, 12, &a, &b, &c, &d, &e, &f, &g, &h, &i, &j, &k, &l); 13 printf("l = %d\n", l); 14 return 0; 15} 16 17// 実際の規則 18int kisoku(int accs, void *data) 19{ 20 int *i = (int *)data; 21 *i = accs + 2; 22 return *i; 23} 24 25/* Haskellでのfoldl(左畳み込み)もどきをCで実現(ただし、int専用) 26foldl :: (a -> b -> a) -> a -> [b] -> a 27foldl f a [] = a 28foldl f a (x:xs) = foldl f (f a x) xs 29※ aはint、[b]は[void*]だけど、配列では無く可変長引数なので残数付き。 30*/ 31int foldl(int (*func)(int, void *), int accs, int count, ...) 32{ 33 va_list list; 34 va_start(list, count); 35 accs = vfoldl(func, accs, count, list); 36 va_end(list); 37 return accs; 38} 39 40int vfoldl(int (*func)(int, void *), int accs, int count, va_list list) 41{ 42 if (count == 0) { 43 return accs; 44 } else { 45 // 末尾呼出し最適化してくれるかもしれない。 46 return vfoldl(func, func(accs, va_arg(list, void *)), --count, list); 47 } 48}

投稿2015/10/19 14:16

raccy

総合スコア21735

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

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

0

配列を使うか、質問文にお書きのように書くか、二択なので、どちらでもいいかと思います。

こんな感じである規則に従って一気に代入したいんです。

「ある規則」というのを具体的に書くと、よりよいアドバイスが得られる可能性があります。
+2 なのであれば、別に今のままでも悪くないと思いますが。

投稿2015/10/19 13:00

otn

総合スコア84538

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

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

0

ベストアンサー

intのポインタを使えば何とかなりますが・・・
e.g.
int * ary[]={
&a,&b・・・
};

for( int i= 0; i < (sizeof(ary)/sizeof(ary[0])); i++ ){
*ary[i]= XXXX;
}
・・・結局配列か^^;

投稿2015/10/19 06:55

編集2015/10/19 07:00
cateye

総合スコア6851

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

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

akamakku

2015/10/20 03:09

おとなしく配列を使うことにしました(笑)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問