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

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

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

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

3454閲覧

C++で競技プログラミング、for文の中での文字列型の扱いについて

hon.ki

総合スコア157

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/01/31 09:18

https://atcoder.jp/contests/abc115/tasks/abc115_a
の問題を解いておりましたところ、C++の文法について、わからないことがございましたのでご教授いただければと思います。

#include <iostream> #include <string> using namespace std; string solve(int x) { string a("eve"); string b = ""; for (int i = 0; i < 25-x; i++) { string b += a; //bにの末尾にaをn回足す、という操作が書けない } return b; } int main() { int n; cin >> n; string ans = solve(n); cout << "Christmas" << ans << endl; return 0; }

としたところ、ローカル環境で
test96.cpp: In function 'std::__cxx11::string solve(int)':
test96.cpp:11:18: error: expected initializer before '+=' token
string b += a; //bにの末尾にaをn回足す、という操作が書けない
^~
となりました。変数bにの末尾に変数aをn回足して変数bに格納する(格納されるデータはstring型)という操作を記述するとしたら、どのような書き方があるのでしょうか。あるいはstring型にこだわらない方がいいのでしょうか。
なお、問題自体は

#include <iostream> #include <string> using namespace std; int main() { int n; cin >> n; cout << "Christmas" ; for(int i=0; i<25-n;i++){ cout << "Eve"; } cout << endl; return 0; }

とすれば良いことは他の方の提出から理解できまして、上記問題を回答する上で本質問の知識は必要ないことはわかったのですが、気になってしまい、質問させていただきました。どうぞよろしくお願いいたします。

なお、ローカル環境とはなお、ローカル環境とは、mac OS High Sierra10.13.6
コンパイラは
Apple LLVM version 10.0.0 (clang-1000.10.44.4)
Target: x86_64-apple-darwin17.7.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin
になります。デフォルトのC++14で、コンパイルしました。
VSCodeを使っています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

for文内でbを宣言する必要は全くありませんし、
宣言したばかりの変数に対して加算代入を試みる意味も良く分かりません。

C++

1for (int i = 0; i < 25-x; i++) 2{ 3 b += a; 4}

for文の中での文字列型の扱い

文字列型を扱っていることとは関係ないです。
次のように『1から10までの自然数の和』を計算しようとしてエラーを吐くのと同じです。

C++

1#include <iostream> 2 3int main(void) { 4 int num = 0; 5 for(int i = 0; i < 10; ++i) { 6 int num += i + 1; 7 // num += i + 1; こっちが正しい 8 } 9 10 std::cout << num << "\n"; 11}

エラーメッセージ Wandbox

prog.cc: In function 'int main()': prog.cc:6:17: error: expected initializer before '+=' token int num += i + 1; ^~

入門書を一通り読んだ方が良いかと。

投稿2019/01/31 09:21

編集2019/01/31 09:40
LouiS0616

総合スコア35660

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

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

hon.ki

2019/01/31 12:27

LouiS0616さん、回答ありがとうございます。ご指摘いただいた箇所を直しましたところ、無事実行できました。確かに、見慣れたint型の例に読み替えて説明していただいて見ますと、はっきりと直すべき箇所がわかりました。 また、「宣言したばかりの変数に対して加算代入を試みる意味も良く分かりません。」との言葉をいただき、考えてみたのですが、solve(x)の中身について考える上で、return b; を最初に置いてしまったことが原因だと思います。 bへの加算代入を用いないで、 solve(x)内をもっと簡潔に書くことは可能ということでしょうか?(とても知りたいですが、分かりません。) 入門書について、これを機にしっかり読み直したいと思います。回答本当にありがとうございました。
LouiS0616

2019/01/31 13:08

> bへの加算代入を用いないで、 solve(x)内をもっと簡潔に書くことは可能ということでしょうか? いえ、そういう意図で書いたわけでは無いです。 『宣言したばかりの変数に対して』というところが肝要です。 int型の変数を例にあげると、int a += 10; のように書くことが無意味だということです。 たとえ文法上許されていたとして、しかもintの初期値が0であることが保証されていたとしても、int a = 10; と何か差があるのでしょうか。
hon.ki

2019/01/31 14:05

お返事ありがとうございます。確かに、差はありませんね。従って仰る通り、意味がありませんね。  int a+= 10; が文法上許されたとして、forで囲んで何回ループしたとしても、aは10にしかなりませんね。  int aという表記が、aの宣言であるという意識と、宣言についての意味理解の薄さが、このようなミスをさせたと感じました。(だから、a += 10; の効果を頭でイメージしながら、int a += 10; と書いてしまいました) 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問