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

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

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

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

Q&A

解決済

1回答

706閲覧

while文の条件式

Merrifield

総合スコア31

C

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

0グッド

0クリップ

投稿2020/09/24 01:57

上のコードは自分で書いたコードで、下のコードは別の方が書いたコードなのですが、while文の部分を参考にしてみたのですが、自分のコードだけなぜかwaringが出ます。どこか間違えている部分があるのでしょうか?また、while文の条件式の部分は、どういった処理を行っているのでしょうか?

//自分で書いた int solve(const char *str_in) { int sum = 0, ret = 0; char *c; while(c = *str_in++) { if(*str_in != 'a' && *str_in != 'e' && *str_in != 'i' && *str_in != 'o' && *str_in != 'u') { sum += *str_in - 'a' + 1; if(ret < sum)ret = sum; } else { sum = 0; } //str_in++; } return ret; }
//別の方が書いた int solve(const char* strin) { char *vowels = "aeiou"; int solution = 0; int current = 0; char *c; while(c = *strin++) { current = strchr(vowels, c) ? 0 : current + c - 96; if(current > solution) solution = current; } return solution; }

warning

solution.c:5:13: warning: incompatible integer to pointer conversion assigning to 'char *' from 'const char' [-Wint-conversion] while(c = *str_in++) ^ ~~~~~~~~~ solution.c:5:13: warning: using the result of an assignment as a condition without parentheses [-Wparentheses] while(c = *str_in++) ~~^~~~~~~~~~~ solution.c:5:13: note: place parentheses around the assignment to silence this warning while(c = *str_in++) ^ ( ) solution.c:5:13: note: use '==' to turn this assignment into an equality comparison while(c = *str_in++) ^ == 2 warnings generated.

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

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

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

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

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

Y.H.

2020/09/24 02:11

> 自分のコードだけなぜかwaringが出ます。 「別の方が書いた」コードでもwaring出ませんか?
DreamTheater

2020/09/24 02:11

> while文の条件式の部分は、どういった処理を行っているのでしょうか? それを理解せずになぜコードが書けたのですか?
Merrifield

2020/09/24 02:20

>>「別の方が書いた」コードでもwaring出ませんか? 出ないです。
Y.H.

2020/09/24 02:27

> 出ないです。 本当に? char *型の変数 c に char 型の値を代入しているのに? $ cat ddd.c #include <stdio.h> //別の方が書いた int solve(const char* strin) { int solution = 0; char *c; while(c = *strin++) { } return solution; } $ cc -c ddd.c ddd.c: In function ‘solve’: ddd.c:6:11: warning: assignment makes pointer from integer without a cast [-Wint-conversion] while(c = *strin++) { ^ もしかして「別の方が書いた」コードではchar *c; じゃなくて char c; になってませんか?
Zuishin

2020/09/24 02:49 編集

c は char* で str_in は const char* で、*str_in++ は const char なので、この型が違うという警告です。別の方が書いたコードにも同じ問題が含まれています。 警告が出るかどうかはどうやって確かめたんでしょうか? 以前、正解なら警告は出ないというのが複数回の質問でありましたが、またそれではありませんか?
Merrifield

2020/09/24 02:46

>>もしかして「別の方が書いた」コードではchar *c; じゃなくて char c; になってませんか? なっていないです。そのままコピーしていますので。 *c; じゃなくて char c; だったら文法的には問題はないのですかね?
Y.H.

2020/09/24 02:47

> *c; じゃなくて char c; だったら文法的には問題はないのですかね? はい。
Merrifield

2020/09/24 02:51

>>Znuishinさん 以前と同じサイトで確かめました。https://www.codewars.com/kata/59c633e7dcc4053512000073/train/c 以前のものは、正解なら警告は出ないというより、不正解ならおかしな警告が出るということでしたが、それとは違うような気がします。まだ分からないですが。文法に問題があったら、そもそも正解にはならないと思うので。ただ、私も別の方が書いたコードが型が異なるという問題がある気がするので、そこが分からないですね。
Zuishin

2020/09/24 02:54 編集

いえ、「正解なら警告を出さない」という仕様です。同じ問題ですね。文法に問題があっても警告なら通ります。 前回も書きましたが、警告とエラーは違います。 ここは重要なのでもう一度書きます。 警告とエラーは違います。
Merrifield

2020/09/24 03:02

警告なら通るのでしたね。本来は、char *c;でなくてchar c;書くところを、正解だったからそのまま通ってしまっているということですね。
guest

回答1

0

ベストアンサー

どこか間違えている部分があるのでしょうか?

c = *str_in++の両辺で型が一致していません。

投稿2020/09/24 02:05

maisumakun

総合スコア146018

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問