移殖作業は、答えとなる稼働中システムがあるため作業難度は低いんですが、
2つの言語仕様を理解していないとちょっとした勘違いではまってしまうことが、、、
そんな移植作業(C言語からC#)で発見したちょっとしたネタを紹介。
1.int int_array??(5??) = ??< 1, 2, 3, 4, 5 ??>;
見出しの処理はC言語で書かれたコード。
なんだこれ、普通に読めない。
??はC#ではnull合体演算子だけど、C言語でそんなのあったっけ?
文字化けしたんかな?
チーム内で誰も知らないし、ちょっと調べてみることに
実はトライグラフという機能を使ってコーディングしたものだと判明。
同じソースをトライグラフを使わずにコードすると次の通り。
int int_array[5] = { 1, 2, 3, 4, 5 };
トライグラフは「ISO 646 に共通して含まれる文字だけでソースコードを書くための表記法」だそうで、
3文字の組み合わせでISO 646 に足りない範囲の文字を表現しようというもの。
うーんわかりにくい。
※トライグラフの一覧
??= → #
??( → [
??/ → \
??) → ]
??' → ^
??< → {
??! → |
??> → }
??- → ~
2.-1が1より大きい?
int a = -1;
uint b = 1;
if (a > b) { ① }
else { ② }
実は上のコード、C言語とC#で結果が変わります。
C言語 : 処理①が実行
C# : 処理②が実行
-1 > 1 だから「偽」になるべき(C#の動作)では?
何で①に?
よくわからないので調べてみることに、
比較する際にデータ型が異なる場合、暗黙の型変換を行いますが、
変換仕様が異なるためにこんな現象が発生しています。
C言語では uint > int の優先順位のため、intからuintに変換して判断されます。
例の場合、aの-1がuintに変換されるため、
4,294,967,295 > 1 となり「真」と判断されます。
C言語では、データ型の異なる変数同士の比較はやめておきましょう。