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

デッドコード *p++

warning: value computed is not used
warning: expression result unused

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

■*p++の丸括弧が足りない

#include    <stdio.h>
void    increment(int *p)
{
    *p++ ;//ダメ:デッドコード
}
int main(void)
{
    int     x = 1234 ;
    printf("前:%d\n",x);
    increment(&x);
    printf("後:%d\n",x);
}

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


➡(*p)++に修正

#include    <stdio.h>
void    increment(int *p)
{
    (*p)++ ;//丸括弧を付ける
}
int main(void)
{
    int     x = 1234 ;
    printf("前:%d\n",x);
    increment(&x);
    printf("後:%d\n",x);
}

「ポインタをひとつ進めたい」➡ p++
「ポインタの指す先に1を加えたい」➡(*p)++

*p++は
p++と同じなので
* を付けている意味がありません。


■*p++の*が多い

#include    <stdio.h>
int my_strlen(char *p){
    int len = 0 ; 
    while(*p != '\0'){
        *p++ ;//ダメ:デッドコード
        len++ ;
    }
    return  len;
}
int main(void){
    printf("%d\n",my_strlen("abcd"));
}

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


➡p++に修正

#include    <stdio.h>
int my_strlen(char *p){
    int len = 0 ; 
    while(*p != '\0'){
        p++ ;//*は不要
        len++ ;
    }
    return  len;
}
int main(void){
    printf("%d\n",my_strlen("abcd"));
}

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

注意:

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

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

参考:

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

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