上のコードは自分で書いたコードで、下のコードは別の方が書いたコードなのですが、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.
> 自分のコードだけなぜかwaringが出ます。
「別の方が書いた」コードでもwaring出ませんか?
> while文の条件式の部分は、どういった処理を行っているのでしょうか?
それを理解せずになぜコードが書けたのですか?
>>「別の方が書いた」コードでもwaring出ませんか?
出ないです。
> 出ないです。
本当に? 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; になってませんか?
c は char* で str_in は const char* で、*str_in++ は const char なので、この型が違うという警告です。別の方が書いたコードにも同じ問題が含まれています。
警告が出るかどうかはどうやって確かめたんでしょうか?
以前、正解なら警告は出ないというのが複数回の質問でありましたが、またそれではありませんか?
>>もしかして「別の方が書いた」コードではchar *c; じゃなくて char c; になってませんか?
なっていないです。そのままコピーしていますので。
*c; じゃなくて char c; だったら文法的には問題はないのですかね?
> *c; じゃなくて char c; だったら文法的には問題はないのですかね?
はい。
>>Znuishinさん
以前と同じサイトで確かめました。https://www.codewars.com/kata/59c633e7dcc4053512000073/train/c
以前のものは、正解なら警告は出ないというより、不正解ならおかしな警告が出るということでしたが、それとは違うような気がします。まだ分からないですが。文法に問題があったら、そもそも正解にはならないと思うので。ただ、私も別の方が書いたコードが型が異なるという問題がある気がするので、そこが分からないですね。
いえ、「正解なら警告を出さない」という仕様です。同じ問題ですね。文法に問題があっても警告なら通ります。
前回も書きましたが、警告とエラーは違います。
ここは重要なのでもう一度書きます。
警告とエラーは違います。
警告なら通るのでしたね。本来は、char *c;でなくてchar c;書くところを、正解だったからそのまま通ってしまっているということですね。
回答1件
あなたの回答
tips
プレビュー