C++の一重引用符「文字列」の使い方
1205 ワード
今日、仕事中に少し奇妙なコードセグメントを見ました.たぶんそうです.
ボタンC++の標準、flagは1つの整形で、最近Luaを書き慣れた私にとって、このような使い方はすぐに見慣れなくなって、私は多くの人にとって、このような使い方はすべて見慣れていないかもしれないと思って、時間の有限はしばらくC++標準の中で'ABCD'という“文字列”に対してどのように定義したことを管理しないで、では、書き方から見ると「ABCD」は整数定数を表しているはずなので、この使い方がどうなっているのかコードを書いてみましょう.
では、出力の結果は何でしょうか.
1094861636 DCBA
結果から、G++は「ABCD」の各文字をflagという変数の各バイトに1つずつ与えていることがわかります.IntelのCPUを使用しているので、x 86ベースのアーキテクチャです.X 86では小端モードを採用し、整形の高位をメモリの低アドレスに置く.出力printf("%X",flag)を1つ追加すると、出力は41424344,41が文字Aであることがわかるので、「ABCD」が表す値はA<<24+B<<16+C<<8+Dである.
CPUは小端モードを採用しているため、flagを文字列出力に強制変換することは、Aがこの整数型の上位であるため、Aを最後の出力に置くことである.
By the way、flag='ABC'またはflag='ABCDEと書くと何が起こるのでしょうか?自分でやってみると、コンパイルが通らない場合がありますよ.
END
switch (flag)
{
case 'ABCD':
TODO
break;
case 'EFDG':
...
break
....
default:
break;
}
ボタンC++の標準、flagは1つの整形で、最近Luaを書き慣れた私にとって、このような使い方はすぐに見慣れなくなって、私は多くの人にとって、このような使い方はすべて見慣れていないかもしれないと思って、時間の有限はしばらくC++標準の中で'ABCD'という“文字列”に対してどのように定義したことを管理しないで、では、書き方から見ると「ABCD」は整数定数を表しているはずなので、この使い方がどうなっているのかコードを書いてみましょう.
#include <iostream>
#include <string.h>
using namespace std;
int main()
{
int flag = 'ABCD';
cout<< flag <<endl;
char * array = (char *)&flag;
char buff[5] = {0};
strncpy(buff, array, 4);
cout << buff <<endl;
return 0;
}
では、出力の結果は何でしょうか.
1094861636 DCBA
結果から、G++は「ABCD」の各文字をflagという変数の各バイトに1つずつ与えていることがわかります.IntelのCPUを使用しているので、x 86ベースのアーキテクチャです.X 86では小端モードを採用し、整形の高位をメモリの低アドレスに置く.出力printf("%X",flag)を1つ追加すると、出力は41424344,41が文字Aであることがわかるので、「ABCD」が表す値はA<<24+B<<16+C<<8+Dである.
CPUは小端モードを採用しているため、flagを文字列出力に強制変換することは、Aがこの整数型の上位であるため、Aを最後の出力に置くことである.
By the way、flag='ABC'またはflag='ABCDEと書くと何が起こるのでしょうか?自分でやってみると、コンパイルが通らない場合がありますよ.
END