warning: statement with no effect
警告:何の効果も無い式や文
[-Wunused-value]
■1.代表的な無効式 i == 0;
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
void f1(void)
{
int i ;
i == 0 ;// 代表的な無効式
}
■2.無効式はエラーにならない
void f2(void)
{
123; //数字があります。そしてそれきり。
f1 ; //関数のアドレスがあります。そしてそれきり。
}
■3.for文第1式で初期化しないなら何も書かなくてOK
void f3(void)
{
int i ;
for(i = 0; i < 10; i++){
printf("0~9の処理 %d\n",i);
}
//初期化しないならば何も書かない
for(i ; i < 20; i++){
printf("10~19の処理 %d\n",i);
}
}
for文第1式は初期化不要ならば何も書かなくて良いです。
for(i ; i < 20; i++){ではなくて
for( ; i < 20; i++){で良いです。
for(i ; i < 20; i++){と記述すると初期化を忘れたのか意図的に初期化しないのか読む人がわかりません。
■4.第3式は+iではなくて++i
void f4(void)
{
for(int i = 0 ; i < 10; +i) {
printf("第三式はプラスのi=%d\n",i);
}
}
■5.(i,j)の i の値は単に捨てられる
bool f5(int i,int j)
{
//iは無視される。(i<j)の間違い?
bool k = (i,j);
printf("%d\n",k);
return k;
}
bool k = (i,j); は
bool k = j ; と同じです。(i < j)としたかったのかもしれません。
■6.strcmp()の戻り値無視
void f6(void)
{
char dst[1024] ={0};
//戻り値未使用。strcpy()の間違い?
strcmp(dst,"src");
printf("%s\n",dst);
}
strcmp(dst,”src”)は戻り値を使用していないので文字列比較関数strcmp()を呼んだ意味がありません
(比較した結果を使用していない)
strcpy()と間違ったのかもしれません。
■7.return を忘れた!
warning: expression result unused
警告:式の結果を使っていない
#include <stdio.h>
enum {OK,NG} ;
int f(const int *p){
if (p == NULL)
NG ;//return NG ???
return OK ;
}
#include <stdbool.h>
bool g(const int *p){
if (p == NULL)
false;//return false ???
return true ;
}
NGとだけ記述してもコンパイルエラーにならずに
間違いに気が付かない場合があります。
※何故か11 行目のbool型では警告出ません。

■8.for(;条件1,条件2;)の条件1は無視される
warning: left-hand operand of comma expression has no effect
警告:カンマの左辺式の結果は捨てられる
[-Wunused-value]
#include <stdio.h>
int main(void) {
int i,j;
for(i = 0, j = 0 ;
i < 10, j < 20 ;//★NG
i++,j+=2) {
printf("i = %d¥n",i) ;
printf("j = %d¥n",j) ;
}
}
for文の第1式と第3式のカンマ演算子は意味がありますが、
for文の第2式のカンマ演算子は
左側の式の結果は捨てられるので意味がありません。
i < 10, j < 20 ;ではなくて
i < 10&&j < 20 ;の可能性があります。

■9.2次元配列の参照は buf[0,0]ではない
#include <stdio.h>
int buf[3][3] = {
{1,2,3},
{4,5,6},
{7,8,9}
};
int main(void){
int x = buf[0,0];printf("%d\n",x);//NG
int y = buf[2,2];printf("%d\n",y);//NG
}
2次元配列の参照は
buf[0,0]ではなくて
buf[0][0]です。
参考: