mixiからのお引越し
プログラミング系の日記をこちらにコピペ終了.
まぁ,普段の日記の中にプログラミングの話が埋もれてしまうのを避けたかっただけ.
gccできめぇ実験.
ショートコーディングにおいて,大量の配列を宣言するとき
a['ZZZ'];
と宣言するテクニックがある.それを解析する.
プログラム
#include
int main(){
long long int a;
a='012';
printf("%x\n",a);
a='012345';
printf("%llx\n",a);
printf("%llx\n",'012345');
printf("%c %c %c %c %c %c\n",
( (char*)&a)[0],((char*)&a)[1],( (char*)&a)[2],
( (char*)&a)[3],((char*)&a)[4],( (char*)&a)[5]);
}
結果はこちら
303132
32333435
32333435
5 4 3 2
ちなみに30が'0',31が'1',・・・ である.
まじ,((char*)&a)[1]とかきめぇな.よい子は真似しないでね
まず,文字定数は4byte( sizeof(int) )であることが分かるだろう.
01はメモリ外で情報が消えている.
リトルエンディアンで"012345"の前4byteの値をとってきているのだろうか.
まぁ,そんな感じの値は出ている.
ちなみに,(long long int) '012345'しても4文字のままだった.
結論: 文字定数はint型.2文字以上書けるコンパイラもあるけど,書式守れよ?
文字定数はint型
プログラム
#include
int main(){
char c1=1,c2=2;
printf("%d\n",sizeof c1);
printf("%d\n",sizeof(c1+c2));
printf("%d\n",sizeof 'A');
printf("%d\n",sizeof( (char)1+(char)2));
printf("%d\n",sizeof( (char)'A'));
printf("%d\n",sizeof( (char)1));
printf("%d\n",sizeof(c1++));
printf("%d\n",sizeof(++c1));
}
結果
1
4
4
4
1
1
1
1
どうやら,インクリメントはcharのままでやってくれるらしいですね.
キャストは評価順を考えれば,そのとおりですか.
命題:ハロウィンとクリスマスは同じである.
証明:
ハロウィンは OCT 31 である.
Octal(8進数)の31は,Decimal(10進数)の25である.
つまり,
OCT 31 = DEC 25
ところで,DEC 25 といえばクリスマスである.
よって,前述の式よりハロウィンとクリスマスは同じである.
しまった
i;x;main(a,u,t,n){for(;~scanf("%d",&x);i--?i||printf("%d\n",(a-t-u)/(n-2)):main(0,&x,0,i=x))a+=x>t?t=x:x,x
twitterプログラミング
先輩「140文字以内ならtwitterでつぶやけばいいんじゃね?」
私「それ,いいっすね!!」
結果
http://twitter.com/fusigichang/status/5173465413
nを与えて,そのあとn個の数字を与える.
そのとき,n個の数字の中で最大と最小を取り除いたものの平均を求めるプログラム.
だれだよ,こんな宣言したやつ
unsigned const long long typedef int volatile *(*d[10])(int **p),a;
/*
これは
dはunsigned const long long int volatile型へのポインタを返す,引数がintのポインタのポインタである関数へのポインタを10個格納する配列を定義するための型で,aはunsigned const long long int型
ということを意味する.ちなみにvolatileはconstの反対の意味を持つ型修飾子.autoと一緒で誰も書きはしない.
typedefは型指定の記憶クラス(static,register,autoなど)に含まれるので,宣言の途中に入ってもまったく問題がないっていうね.*/