コマンドラインから0個以上の1桁の整数の和を出力するCプログラムを考えているのですが,破壊的代入やfor, while, main以外の関数定義を用いずに済ませたいです.
どのように記述すれば解決できまでしょうか.
$./ex 1 2 3
6
のようにしたいです.
###追記
=,+=,++
なども用いない方法でお願いいたします.
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
+= は、元の値を利用するから破壊的代入ではないとすれば、
C
1#include <stdio.h> // printf 2#include <stdlib.h> // atoi 3 4int main(int c, char **v) 5{ 6 static int s; 7 --c ? s += atoi(*++v), main(c, v) : printf("%d\n", s); 8}
+= を使わない方法もありますが、知りたいですか?
追記
条件に 1桁の整数とあるので atoi は不要でした。
atoi(*++v)
を **++v - '0'
に変更してください。
追記2
./ex 1 2 3 だと、c=4, v[0]="./ex", v[1]="1", v[2]="2", v[3]="3", v[4]=NULL
--c, ++v で main が再帰的に呼び出されると、次のようになります。
c=3, v[0]="1", v[1]="2", v[2]="3", v[3]=NULL
c=2, v[0]="2", v[1]="3", v[2]=NULL
c=1, v[0]="3", v[1]=NULL
c=0, v[0]=NULL
++ も使ってはいけないのですか?
質問に追記してください
システムコールとは何ですか?
Unix(Linux) なら open, close, read, write などをシステムコールと言います。
c
1#include <stdio.h> 2 3int main(int c, char **v) 4{ 5 return c ? **v - '0' > 9u ? printf("%d\n", main(c-1, v+1)) : 6 **v - '0' + main(c-1, v+1) : 0; 7}
追記3
9 があると正しい結果が出ないバグを修正しました。
追記4
コマンド名が数字で始まっていてもいいようにすると、
c
1#include <stdio.h> 2 3int main(int c, char **v) 4{ 5 return c ? printf("%d\n", main(0, v+1)) : *v ? **v - '0' + main(0, v+1) : 0; 6}
投稿2021/05/07 03:47
編集2021/05/08 15:53総合スコア8224
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/07 07:00
2021/05/07 07:10
2021/05/07 12:32
2021/05/08 00:26
2021/05/09 14:51
0
main
を再帰させてみてはどうでしょうか?(C言語では許されています)
投稿2021/05/07 00:18
総合スコア146018
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/07 06:58
2021/05/07 07:03
2021/05/07 07:13
2021/05/07 07:22
2021/05/07 08:21
2021/05/07 08:26
2021/05/07 09:55
2021/05/07 22:14
2021/05/09 14:48
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。