【C言語】
デッドコード (冗長コード)
*p++ の *

warning: value computed is not used

警告:計算された値は使用されません
[-Wunused-value]

■1.*p++代表的なデッドコード

#include    <stdio.h>
void    incNG1(int *p)
{
    *p++ ;//ダメ:デッドコード
}

*p++ の * がデッドコードです。
この関数を呼んでもポインタpの指す先は加算されません。


■2.*p++を2行で書く

void    incNG2(int *p)
{
    *p;//ダメ:デッドコード
     p++ ;
}

incNG1()の*p++を2行に分けて記述したのがincNG2( )です。
【*p】を日本語で言うと
【ポインタの指す先が有りますそしてそれきり】何もしていません。
【p++】もポインタが前進しますが、
以降参照していないので意味がありません。
結局 incNG1()もincNG2()も何もしない関数です。


■3.(*p)++に修正

void    incOK(int *p)
{
    (*p)++ ;//OK:(*p)=(*p)+1と同じ
}
void m1(void)//1を加算したい
{
    int i = 1234 ; 
    incNG1(&i);  printf("%d\n",i);
    incNG2(&i);  printf("%d\n",i);
    incOK(&i);   printf("%d\n",i);
}

「ポインタをひとつ進めたい」ならば   
        p++
「ポインタの指す先に1を加えたい」ならば 
        (*p)++
*p++は
p++と同じなので * を付けている意味がありません。


■4.*p++の事例

int my_strlenNG1(char *p)
{
    int i = 0 ; 
    while(*p != '\0'){
        *p++ ;//ダメ:デッドコード
        i++ ;
    }
    return  i;
}

4行目の*p != ‘\0’につられて
5行目も*p++ と書いてしまう場合が多いですが
5行目の*p++ の*がデッドコードです。


■5.*p++を2行で書くその2

int my_strlenNG2(char *p)
{
    int i = 0 ; 
    while(*p != '\0'){
        *p; //ダメ:デッドコード
         p++ ;
        i++ ;
    }
    return  i;
}

my_strlenNG1()の*p++を2行に分けて記述したのが
my_strlenNG2( )です。
*pがデッドコードになります。


■6.p++に修正

int my_strlenOK(char *p)
{
    int i = 0 ; 
    while(*p != '\0'){
        p++ ;
        i++ ;
    }
    return  i;
}
void m2(void)
{
    printf("%d\n",my_strlenNG1("123"));
    printf("%d\n",my_strlenNG2("123"));
    printf("%d\n",my_strlenOK ("123"));
}

デッドコードは削除しましょう。

注意:

デッドコードの定義には主に下記2種類あります。
(1) 到達不能コード
(2) 冗長コード
  ⇒制御は来るが
  あってもなくても動作に影響しないコード

ここでは(2)の意味で使っています。

参考:

C-FAQ 4.3: *p++はpを増分するか。それともpが指すものを増分するのか。

http://www.kouno.jp/home/c_faq/c4.html#3