C++の一重引用符「文字列」の使い方

1205 ワード

今日、仕事中に少し奇妙なコードセグメントを見ました.たぶんそうです.
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