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
warning: Value stored to ‘x’ is never read
警告:’x’に格納された値が読み出されない
[clang-analyzer-deadcode.DeadStores]
■return x++ の後置演算子がデッドコード
#include <stdio.h>
int increment(int x)
{
return x++; //NG:意味なし++
}
int main(void)
{
printf("%d\n",increment(1234)) ;//1234と表示される
}
自動変数 x を return 時に後置演算で ++ しても、
もはや誰も参照できないので 後置演算++ に意味がありません。
++ した値を return したいのであれば
2行に分けるか、
前置演算子を使いましょう
➡2行に分けた修正例
#include <stdio.h>
int increment(int x)
{
x++;
return x; //2行に分ける
}
int main(void)
{
printf("%d\n",increment(1234)) ;//1235と表示される
}
➡前置演算子を使った修正例
#include <stdio.h>
int increment(int x)
{
return ++x; //前置演算子
}
int main(void)
{
printf("%d\n",increment(1234)) ;//1235と表示される
}