【C言語】
for文第一式で初期化しないならば何も書かなくてOK

warning: statement with no effect

警告:何の効果も無い式や文
[-Wunused-value]

■代表的な無効式 i == 0;

#include    <stdio.h>
#include    <stdbool.h>
#include    <string.h>
void    f1(void)
{
    int i ;
    i == 0 ;//  代表的な無効式  
}

■無効式はエラーにならない

void    f2(void)
{
    123; //数字があります。そしてそれきり。   
    f1 ; //関数のアドレスがあります。そしてそれきり。
}

■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++){と記述すると初期化を忘れたのか意図的に初期化しないのか読む人がわかりません。

■第3式はi+1ではなくてi++

#include <stdio.h>
int main(void){
    for(int i = 0;i < 10;i+1){
        printf("%d\n",i);
    }
}

■(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)としたかったのかもしれません。

■strcmp()の戻り値無視

void    f6(void)
{
    char    dst[1024] ={0};
    //戻り値未使用。strcpy()の間違い?
    strcmp(dst,"src");  
    printf("%s\n",dst);
}

strcmp(dst,”src”)は戻り値を使用していないので文字列比較関数strcmp()を呼んだ意味がありません
(比較した結果を使用していない)
strcpy()と間違ったのかもしれません。

■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型では警告出ません。


■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 ;の可能性があります。

■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]です。

参考:

MSC12-C. プログラムに対して作用しないコードを検出して削除する

CWE-482: Comparing instead of Assigning