読者です 読者をやめる 読者になる 読者になる

C

C言語のinline

C C++

C/C++のinlineで間違いやすい3つのポイントがある。 1つは、GCCは3種類の異なるinline仕様を使い分けているという点である。3種類とは、「C++のinline」「C90用のGCC拡張inline」「C99以降のinline」である。 2つ目は、inlineを使っても、コンパイラが必ずイ…

C言語における空白文字

C

C言語における空白文字は、文字列の一部分としてと、トークンを明示的に区切る (long long と longlong は違う) こと以外には基本的に無意味というように思える。しかしプリプロセッサレベルでは、以下の場面で意味がある。 includeの中身 通常 <stdio.h> のようなコ</stdio.h>…

C言語の型の読み方

C

C言語の型の読み方の解説は探すと色々出てくるが、改めて自分で説明してみることにした。 用語説明 C言語のポインタ記法に代わる記法として、ここでは次のような記法を導入する。もちろんこれはC言語にはない。 型 T へのポインタを ptr<T> と書く。 型 T が n </t>…

GCCのWarning Optionをあるだけ列挙

#ERR = -Werror OPT = -ansi -pedantic-errors $(ERR) -Wall -Wextra -Wformat=2 -Winit-self -Wswitch-default -Wswitch-enum -Wsync-nand -Wstrict-aliasing=1 -Wstrict-overflow=5 -Wsystem-headers -Wfloat-equal -Wtraditional-conversion -Wdeclaratio…

i18n的文字列の生成(Golf)

main(a,b,c)char**b,*c;{c=b[1];a=strlen(c);printf("%c%d%c\n",*c,a-2,c[a-1]);} (76bytes)以下はid:javascripterによって提起された元ソース(一部改変) #include <stdio.h> #include <string.h> int main(int argc, char **argv) { char *s; int len; if(argc<2) { fprintf(st</string.h></stdio.h>…

warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result

UbuntuのGCCとかでこういうのが出る。 解説 「scanfの戻り値を使ってないよ」→つまり、scanfが失敗した場合について考えてないコードを書いてるから気をつけろという警告。 対策1 scanfの戻り値を検査する。 scanfの戻り値は、成功した変数の数、もしくは-1…

小町算を一瞬で生成するプログラム 例: 12*34*5+6*7-8*9 = 2010

piがHaskellで組んでこれより速くCで組めるわけないとか挑発されたので、つい… 性能 12*34*5+6*7-8*9 = 2010 のような小町算を生成します。 (1*2/3-4*56)/(7-8)*9 = 2010 のような、括弧を使うものも生成します。 2-(3-4)のような右結合は、等価の左結合、つ…

割り算が壊れたので自分で実装してみました。

あけましておめでとうございます。このブログは通常営業となりました。 概要 http://turi2.net/blog/724.html http://d.hatena.ne.jp/nitoyon/20070629/four_operations_implementation_in_javascript 多倍長での除算がこの前うまく実装できなかったので、復…

charの符号の有無の判定

#include <stdio.h> int main() { char ch = -1; if(ch == -1) { puts("char is signed."); } else { puts("char is unsigned."); } return 0; }</stdio.h>

ビットリバース

ビットを数える・探すアルゴリズムのpopcountをちょっと改変すればいいだけやんけ。 #include <stdio.h> unsigned int bitreverse(unsigned int x) { x = (x & 0x55555555)<<1 | (x & 0xaaaaaaaa)>>1; x = (x & 0x33333333)<<2 | (x & 0xcccccccc)>>2; x = (x & 0x0f0</stdio.h>…

Cプリプロセッサで加算までやった

数値は2進リスト。 #define par_open ( #define par_close ) #define comma , #define cat_(a,b) a##b #define cat(a,b) cat_(a,b) #define defif_val_0(t, f) f #define defif_val_1(t, f) t #define defif_(b) defif_val_##b #define defif(b) defif_(b) #…

CPPで真偽値とリスト

CPPはC PlusPlusじゃなくてC PreProcessorだよ! gcc -E nanntoka.cで実行。 #define par_open ( #define par_close ) #define cat_(a,b) a##b #define cat(a,b) cat_(a,b) #define defif_0(t, f) f #define defif_1(t, f) t #define defif_(b, t, f) defif_…

Cでquine

暫定最短。 #define t(x)u=#x;x t(main(){printf("#define t(x)u=#x;x\nt(%s)",u);}) C preprocessor - Wikipedia, the free encyclopedia

ビット演算関連

基本 フラグとして使ったりするときに必須なやつ。 &で論理積 |で論理和 ^で排他的論理和 ~でビット反転 a|=bでフラグを立てる。 a&=~bでフラグを折る。 a^=bでフラグを反転。 シフト >>で右シフト。算術シフトか論理シフトかは決まってないらしい。 算術シ…

「文字列の中身をランダムに入れ替えるというマイナーな関数」

…のようで、文字列の中身をランダムに入れ替えるというマイナーな関数に関するバグ報告に対しては、「この関数は… Debianがglibcの派生版「eglibc」を採用へ − @IT さがしてみた。 % pwd /home/aaaa/glibc-2.9/string % ls (略) % ack-grep "random" (略)み…

qsortを撃墜し(最悪ケースを与え)てみた。

glibcのqsortをターゲットに、クイックソートの最悪ケースO(n^2)を与えてみた。先日の記事の通り、glibcのqsortはマージソートだが、非常に大きいデータのときはクイックソートを利用するので、そのように仕向けてみた。実行した結果、約5億バイトの配列が確…

glibcのqsort()はクイックソートではない

クイックソートの最悪ケースの実証しようかなーと思ってglibcのソースを見たらクイックソートじゃなかった。まだちゃんとは読んでないが、次のような仕様ではないかと思われる。 まず、必要な一時領域のサイズを決定する。 通常は元の配列と同じ。(nmemb * s…

qnighy's gist: 99683 — Gist #include <stdio.h> int main(int argc, char *argv[], char *envp[]) {( **/**/**/**/**/**/**/**/**/**/**/**/**/**/**/**/**/**/**/**/**/**/**/**/ */**/**/**/**/**/**/**/**/**/**/**/**/**/**/**/**/**/**/**/**/**/**/**/* /**/*</stdio.h>…

C Preprocessors evil behavior

I can't believe that most C compilers can compile such a obfuscated code.http://gist.github.com/98042 %:include /\ \ *\*\*\*\*\*\*\ konyanyachiwa! *\*\*\*\*\*\*\ / <stdio.h> int ma\ in (a,b) int a; char b <::><::>;<% puts("Hel""lo,\ world!"); return 0; %></::></::></stdio.h>

main = 195;

main = 195; It throws no exception in IA32 architecture.Because 195 == 0xc3 means "ret" in IA32.but, char main = 195; throws segmentation fault in my environment.Because it is optimized.We can control this exception by investing "volatile"…

ビット演算でエイトクイーン

ビット演算で華麗に決めてやろうと思ったけど無理だった。どうみても改善の余地あり。 long long o[]={0x101010101010101LL,0x202020202020202LL,0x404040404040404LL,0x808080808080808LL,0x1010101010101010LL,0x2020202020202020LL,0x4040404040404040LL,…