C言語なら俺に聞け 163 (977レス)
上下前次1-新
抽出解除 レス栞
68(4): デフォルトの名無しさん (ワッチョイ fa2d-2PHd) [] 2024/09/09(月) 17:06:32.51 ID:ft14UVke0(1) AAS
lvalueに関してエラーが出るんだけど、どうしてこれがだめなのかわからないです
#include <stdio.h>
int main()
{
char s[] = "hoge";
char t[100];
while (*t++ = *s++)
;
printf("%s", t);
}
69: デフォルトの名無しさん (ワッチョイ 6663-QZ+t) [sage] 2024/09/09(月) 17:17:50.19 ID:JnQxQHVK0(1/3) AAS
>>68
char *p = s;
char *q = t;
while (*q++ = *p++)
こう書けば通る。何故かはちょっと考えて ;
70: はちみつ餃子◆8X2XSCHEME (ワッチョイ 7932-IU9Y) [sage] 2024/09/09(月) 17:19:13.64 ID:XH4OT6yj0(1/2) AAS
>>68
s の型は char[5] 、 t の型は char[100] だというのはわかる?
だけど式に出てくる配列は原則として配列の先頭要素を指すポインタ (この場合に型でいえば char*) に型変換される。
変換後に出てくるポインタは rvalue なのでインクリメントの対象に出来ない。
rvalue ってのは式の評価をする間に一時的に生まれて評価が終わったら消えるものなので
仮にインクリメント出来たとしても何にも使えない。
配列が勝手にポインタに変換されるっていうのが変則的で分かり難いポイントだけど
これは C を使ってたら避けようがない。
90: はちみつ餃子◆8X2XSCHEME (ワッチョイ 7932-IU9Y) [sage] 2024/09/11(水) 09:19:23.27 ID:Zm39E+090(1) AAS
大元の質問が >>68 なので低レイヤからの説明はあまり筋が良くないと思う。
エラーメッセージの意味を読み取れるようにならないから。
185(1): デフォルトの名無しさん (ワッチョイ 9794-z7on) [sage] 2024/09/15(日) 17:53:23.56 ID:V70NGKYC0(1) AAS
>>68
規格に後置++演算子は実数型とポインタ型にしか使えないとあったけどそれの関係じゃないの?
規格でそう決まってるだけの話では?
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 1.285s*