以下のコードを考えると
char buf[] = "asfsf";
char *a=buf;
++*a++;
cout<<*a;
結果は「s」の次の文字である「t」になると思いますが、結果は「s」のままです。どうして?
++ * a ++がと同じではない理由
*a++;
++*a;
cout<<*a;
それは本当に++ i ++と重複する質問ですか?++ i ++は未定義の動作であり、コンパイルエラーが発生することはわかっていますが、++ * i ++は実際に実行できます。私の場合も未定義の振る舞いですか?
現在のところ、文字列リテラルの内容を変更しようとするため、コードの動作は未定義です。
コンパイラがそのようなコードを受け入れないようにする1つの方法(おそらく好ましい方法)は、次のa
ように定義することです。
char const *a="asfsf";
このように、++*a
パーツは単にコンパイルされません。
説明のために、コードを少し変更して次のようにします。
#include <iostream>
int main(){
char x[]="asfsf";
char *a = x;
++*a++;
std::cout<<x;
}
これa
で、実際に書き込むことができるメモリをポイントし、意味のある結果を得ることができます。これは印刷されbsfsf
ます。印刷するとa
、が表示されますsfsf
。
何が起こっているのかというと、それはa++
インクリメントしますが、それでも元の値を生成します。これは逆参照され、の最初の要素への参照を提供します。次に、プリインクリメントがそれに適用され、からに変更されます。a
a
x
a
b
ポインタをインクリメントし、結果を逆参照してからインクリメントする場合は、次を使用します++*++a;
。ええと、いいえ、あなたはそれを使わないでしょう-あるいは少なくとも私はあなたが使わないことを望みます。a
配列の2番目の要素を指すようにインクリメントし、次にその2番目の要素をインクリメントしてからs
に変更します。t
ただし、コードを読んだ人は、そのように書くのが嫌なら、完全に許されます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加