
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)の意味で使っています。
参考:
http://www.kouno.jp/home/c_faq/c4.html#3
