C言語は大学の講義などでも使われることが多く、あまりプログラミングを知らない人でもそれなりに読めてしまうので、面白くありません。
そこで、ここでは一歩差をつけた通っぽいコードを書くために必要なテクニックを3つ紹介したいと思います。
第3位: コンマ演算子を乱用する
,
は左と右の式を評価し、右の式の結果を返す演算子です。これを使わなくていいところで使うことによって、意味の分からないコードにすることができます。
#include <stdio.h>
#define N 10
int main() {
int a[N] = { 0, 1, 2, 3, 4, 5, 6, 7, 8 };
int b[N] = { 9, 8, 7, 6, 5, 4, 3, 2, 1 };
int c[N] = { };
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
for (int k = 0; k < N; k++) {
c[i, j] += a[i, k] + b[k, j];
}
}
}
for (int i = 0; i < N; i++) {
printf("%d ", c[i, i]);
}
printf("\n");
}
上のコードは2つの行列の行列積の対角成分を表示しているように見えますが、実は全然違います。
第2位: 配列演算子を悪用する
arr[i]
は単に*(arr + i)
へと展開されるシンタックスシュガーなので、これを利用して普通は[]
演算子を使わないような所で[]
を使ったり、逆に普通は[]
を使うようなところで使わなかったりするようにすると、非常にコードが読みにくくなります。
#include <stdio.h>
int main() {
for (int dict = 0; dict < 7; dict++) {
putchar(dict["Hello!\n"]);
}
return 0;
}
応用版:
#include <stdio.h>
int main() {
for (int i = 1; i <= 100; i++) {
printf("%d\r%s%s%s\n", i, (4*!!(i%3))+"Fizz", (1*!!(i%15))+" ", (4*!!(i%5))+"Buzz");
}
return 0;
}
第1位: Digraph, Trigraphを使う
様々な事情により#[]{}
などの記号が入力できない人たちのために、Cではコンパイル前に以下のような記号列の変換を行います。
変換前 -> 変換後
??= -> #
??/ -> \
??' -> ^
??( -> [
??) -> ]
??! -> |
??< -> {
??> -> }
??- -> ~
<: -> [
:> -> ]
<% -> {
%> -> }
%: -> #
このうち2文字のものをdigraph、3文字のものをtrigraphといいます。
この仕様を知らない人は多いと思うので、少しコードに取り入れるだけで簡単に難読コードができてしまいます。
??=include <stdio.h>
%:define N 10
int main() ??<
int fib??(N??);
for (int i = 1; i < N; i++) <%
if (i == 0 ??!??! i == 1) ??< fib<:i:> = 1; %>
else ??< fib??(i??) = fib<:i-1??) + fib??(i-2:>; %>
printf("%d\n", fib??(i??));
%>
return 0;
%>
ちなみに、trigraphのあるソースコードはgccだと-trigraphs
オプション付きでなければコンパイルが通りません。