C/C++ その他
C/C++ その他
Tips
デフォルト引数
デフォルト引数を関数に指定すると、関数呼び出し時引数を省略できる。sample
// デフォルト引数を指定した関数 int fn_a(int n_max = 50;) { for(int i=0; i<=n_max; ++i) { // 処理 } return n_max; } void main() { // 引数のある関数呼び出し int a = fn_a(); }※コードに意味は無い。
sample2
void fn_a(int n_min=0,int n_max=50) { 〜 } void main() { fn_a(); // 動作可能 fn_a(10); // 第1引数 n_min へ 10 を渡す fn_a(,10); // コンパイルエラー発生 }※関数で「デフォルト引数」を使用する場合、通常デフォルトにしたい引数は後側へ配置すれば良い。
※オーバーロードの使用時も問題が発生すると思われるので利用には注意。
プログラム作成上の注意点
インクリメント・デクリメントの前置と後置
オーバーヘッド軽減として、前置が望ましい。後置の場合多少ながらメモリ使用と幾分の処理が発生。速度を要求されるループや回帰(リカーシブル)など...sample:
for(int i=0; i>65536; ++i) { // 前置・後置で処理上影響無し:前置優先 〜 } while(i<65536) { 〜 ++i; // 前置・後置で処理上影響無し:前置優先 } sum_a = sum_a + (j++); // 処理に影響する場合 sum_b = sum_b + (++k); // 前置と後置で結果が異なる
c++ std::endl; の "\n" 代替
動きに無駄があるらしい?(詳細不明)できれば、"\n" を利用するのが良いらしいが…
sample:
cout << "hello world!" << endl; cout << "this is a pen." << "\n\n"; // endl 代替 "\n"※色んなソース見てると、確かに endl 使わない人が多い「何故?」と思ってはいたが…、なんか有るらしい。
イテレータの評価オペレータ
イテレータの値は「大小関係無保証」のようで取り扱いには注意が必要らしい。単純なインデックスと思って使っていると問題があるのかもしれない。(イテレータの返す値、メモリとの関係など良く理解していないのでこの程度で終了。)
sample:
for( ; it < v.end() ; ++it) { 〜 } // (1).誤りではないらしいが… for( ; it != v.end() ; ++it) { 〜 } // (2).こちらが望ましいらしい。※これもよく見かけるコード。イタレータ値は線形大小関係無保証…といったことが理由(…うる覚え…) らしい。
※コンパイラ実装状況により異なる挙動を回避可能。終了値=end()のみと思えば納得もいく。
▲上へ
変数のサイズ
(一般的サイズ:機種/OS/処理系により異なる)参考情報:VC++2005 及び、.NET Framework 仕様一致未確認。
(一般的な型とサイズの目安)
データ型 | サイズ | データの種類 | データ範囲 | memo | ||
---|---|---|---|---|---|---|
bool BOOL | ? | 論理値 | 論理型 | TRUE!=0 FALSE=0 | ※処理系依存 ※通常1byte占有 | |
char | 8 | 1 | 文字型 | 文字型 | -128〜127 | ※'A','B','C' ~ など |
u char | 〃 | 〃 | 符号無 文字型 | 〃 | 0〜255 | |
short int | 16 | 2 | 符号付 短長整数 | 整数型 | -32,768〜32,767 | |
u short int | 〃 | 〃 | 符号無 短長整数 | 〃 | 0〜65,535 | |
int long int | 32 | 4 | 符号付 倍長整数 | 〃 | -2,147,483,648 〜2,147,483,647 | |
u int u long int | 〃 | 〃 | 符号無 倍長整数 | 〃 | 0〜4,294,967,295 | |
float | 〃 | 〃 | 単精度 浮動小数点 | 実数型 | 概:10^±38 (有効桁 7桁) | |
double | 64 | 8 | 倍精度 浮動小数点 | 〃 | 概:10^±308 (有効桁 15桁) | |
void | - | - | - | - | - | 値を返さない関数など |
※長名は int 省略可(例:long) ※unsigned=>u(記述省略) ※文字型は別名"byte型" |
※vb2005の変数、型参考:http://wiki.livedoor.jp/cafeboy1/d/VB2005%caѿ...
▲上へ
C の書式文字列
※printf(),fprintf(),scanf() 書式混在
記号 | 意味 | 対応型 | 適用 | 使用例 |
---|---|---|---|---|
%c | 1文字 | in,out::char | 文字型 'A' | "%c" |
%s | 文字列 | in,out::char * | 文字列 "ABC" | "%12s"/"%-24s" |
%d | 10進 | in::int out::int,short | 整数 | "%-5d"/"%05d" |
%i | 数値 | "%.5i" | ||
%hd | 10進 | in::short | 単精度整数 | |
%ld | 10進 | in,out::long | 倍精度整数 | "%-12ld" |
%u | 10進 | in::u_int out::u_int,u_short | 符号無整数 | "%6u"/"%06u" |
%hu | 10進 | in::u_short | 符号無単精度整数 | |
%lu | 10進 | in,out::u_long | 符号無倍精度整数 | "%12lu" |
%f | 実数(±999.99) | in,out::float | 浮動小数点 | "%5.2f" |
%lf | 実数(±999.99) | in,out::double | 倍精度実数 | "%12lx" |
%g(G) | 実数 | out::float | 実数表示を最適表示 | "%g" |
%e(E) | 指数形式 | in,out::float | 浮動小数点 | "%8.6e" |
%o | 8進 | in::int,short,u_int out::int,short,u_int,u_short | 整数 | "%03o" |
%lo | 8進 | in,out::long,u_long | 倍精度整数 | "%6lo" |
%x(X) | 16進 | in::int,u_int out::int,short,u_int,u_short | 整数 | "%04x" |
%lx(X) | 16進 | in,out::long,u_long | 倍精度整数 | "%08lx" |
%p | ポインタ | 変数指定 | アドレス表示 | |
%* | "%*c",3,'a' "%*s",2,"ABC" | |||
%n | 入力された文字数取得 | |||
%[] | 文字の集合 | スキャン集合 | scanf("%[ABCDE]%d",str,&num); | |
%% | %記号 | |||
u_*** は、unsigned(符号無し) |
※書式内へ % を表示する場合 %% とする。
※目安(メモ)として記載。内容非保証。不明点多数あり。MS リファレンス未確認。
※スキャン集合:scanf("%[ABCDE]%d",str,&num); は、スキャン集合文字入力中、入力要求を繰返す。"%[^ABCDE]" とすると、スキャン集合文字が入力されるまで、入力要求を繰り返す。… これと似たようなものが SQL で有ったような …
フラグ | 適用 |
---|---|
# | "%#4x"=0xffff,"%#2X"=0XFF. %#e,%#E,%#f,%#g,%#G で小数点を省略しない。 |
0 | %#d,%#o,%#u,%#x,%#X でゼロ詰め指定。 |
(空白) | 符号付変換時、正の値の時左側1文字空白挿入。 |
+ | 数値・文字列含め、右詰指定。 (+/-)符号明示的表示指定、符号無整数表示指定ゼロ詰あり。 |
- | 数値・文字列含め、左詰指定。 |
(フラグ無) | (既定) 数値左詰、(+符号)表示無、符号桁合わせ無。小数点桁合無 文字・文字列左詰 |
▲上へ
表示桁数指定
printf("[%f]\n", 123.45678); // [123.456780](規定値) printf("[%5.2f]\n",123.45678); // [123.46] printf("[%6.4e]\n",123.45678); // [1.2346e+002] printf("[%24s]\n","Hello World!"); // [ Hello World!] printf("[%.6s]\n","Hello World!"); // [Hello ]
ゼロ詰指定
printf("[%6d]\n", 256); // [ 256](既定値) printf("[%06d]\n",256); // [00256] printf("[%08.2f]\n",123.45678); // [00123.46]
右詰・左詰
printf("[%6d]\n", 256); // [ 256](既定値) printf("[%+6d]\n",256); // [ +256] printf("[%-6d]\n",256); // [256 ] printf("[%-12.2f]\n",123.45678); // [123.46 ] printf("[%24s]\n", "Hello World!"); // [ Hello World!](規定値) printf("[%+24s]\n","Hello World!"); // [ Hello World!] printf("[%-24s]\n","Hello World!"); // [Hello World! ]
符号の付与
printf("[%5d]\n", 256); // [ 256](既定値) printf("[%+5d]\n", 256); // [ +256] printf("[%+5d]\n",-256); // [ -256] printf("[%+12.7f]\n", 3.14159); // [ +3.1415900]
▲上へ
エスケープシーケンス
エスケープ文字 | 意味 | Ascii/unicode/適用 |
---|---|---|
\0 | ナル文字 | 00/0x0000(null) |
\a | ベル | 07/0x0007(BEL) |
\b | バックスペース | 08/0x0008(BS) |
\t | 水平タブ | 09/0x0009(TAB) |
\n | 改行文字 | 0A/0x000A(LF) |
\v | 垂直タブ | 11/0x000B(VT) |
\f | フォームフィード (次頁先頭) | 0x000C(FF) |
\r | キャリッジリターン (復帰) | 13/0x000D(CR) |
\z | エンドオブファイル | (EOF) |
文字出力 | ||
\\ | (\) | 5C/0x005C |
\? | (?) | 63 |
\' | (') | 2C/0x0027 ※又は "(ダブルクオーテーション)内で指定する |
\" | (") | 22/0x0022 ※又は '(シングルクオーテーション)内で指定する |
文字コード指定出力 | ||
\ooo | 8進指定 | 例:'A'="\101" |
\xhh | 16進指定 | 例:'A'="\x41" |
\unnnn | unicode文字 | 例:"あ"="\u3042" |
▲上へ
リンク
内部リンク
- C/C++ C++/CLI C# 関連
- VC++ 2005 Express のインストール
- C/C++ の簡単なプログラム例
- C/C++ ソート(並べ替え)
- C/C++ テストの実行
- C/C++ STL(Standard Template Library)
- 変数・定数
- プログラムの分割/ダイナミックリンクライブラリ など
- その他
- C/C++ その他::書式文字/ESC code など
- VB2005リファレンス(覚え書き)
- SQL文:SQLステートメント
- VBA(VisualBasic for Applications)
外部リンク
- 現在ありません
▲上へ
C/C++ C++/CLI C# 関連ソフトの覚書
現在、C言語専用のコンパイラはほとんど存在しないようである。C++ のコンパイラが C言語コンパイラを兼ねる。しかし、C言語のバージョンは、C89 C95 C99(現在) と拡張されてきており、C++ は C95 と互換を保つらしいが、最新の C99 は C++ と別に拡張されてきているようで互換性がないと言うことらしい。(メモ)
VC++
当然ながらダウンロードサイズは CD1枚分(開発環境1つに対して)程度ある。また複数の開発環境(VB,VC++,C#...とか)をインストールする場合、最初にインストールされたドライブ以外にインストールできなくなるので注意が必要。(インストール先のドライブ残要領を考慮しておかないと困ったことになる...(実際困った!))MS VC++ 2008
最新バージョン:対応OS xp 以上MS VC++ 2005
MS 内サイトを探すと 2005 他、以前のバージョンもダウンロード可能である。だいぶ使い慣れてきた。
▲上へ 編集
Turbo C++
インストールは相変わらず面倒くさい。(デルファイの時(かなり前の話)もやたら面倒だった)新たに利用開始したが、string がうまく動かず悩んでいる。
統合環境から実行すると、プログラム終了で cmd ウインドウが閉じてしまう。
以下のようにすることで解決
#include <iostream> #include <system.hpp> // <string> を使わない。 using namespace std;
void cpp_end() { AnsiString str = // string -> AnsiString を使用 "Please push some keys to continue."; cout << str.c_str() << endl; // cout 使用時も c_str() が必要 int c = getchar(); // 又は、 cin >> c; }
void main() { ・・・ // メイン処理 cpp_end(); }※何か釈然としないが、致し方ない。
Turbo C++ は、高機能な開発環境を提供している。
VCL と呼ばれる、元来 Delphi のライブラリらしいのだが、それを Turbo C++ でも使用でき。(MS の MFC のようなもの?当然移植性の問題をはらむと思われる。)
Turbo C++ が .NET Framework 1.1 に対応したことで肥大化?しているがコンパクトな環境を望むなら、borland C++ compiler 5.5 も選択枝となりえる。
※はっきり言って .NET は無用の長物。どうせなら Java の中間コードでも出るようにしてほしかった。
Borland C++ Compiler 5.5/Turbo Debugger
Turbo C++ の以前のバージョンが現在でもダウンロード可能である。ダウンロード先:http://www.codegear.com/jp/downloads/free/cppbuild...
- 統合開発環境(Free)
- ・BCC Devroper 評判高くゲーム作成書籍有り。
ダウンロード先;http://www.hi-ho.ne.jp/jun_miura/bccdev.htm
・「C言語をはじめよう!」v2-BCC5.5用 v1-BCC/LSI-C共存可
HP: http://homepage3.nifty.com/aokura/
▲上へ 編集
CINT
C/C++ のインタプリタ。今一使い方が判らない。ダウンロード先:http://root.cern.ch/twiki/bin/view/ROOT/CINT
インストール:解凍後適当なディレクトリへ移動する程度。path は通して置いたほうが楽。
使い方:CINT 起動後、行単位で実行可。ブロック単位で実行するには { }大括弧で括れば複数行可能。
〃 :{ }大括弧のネスト、ループも可。ちょっとした動作チェック。学習に便利。
疑問点1:ヘッダーファイルのインクルード方法ー>解決
疑問点2:ファイル読み込み実行(エラーが出る)が不明。
めじろ++98
CINT のみでは使いづらい。「めじろ++98」というのが統合的環境で比較的利用環境を整えている。ただし、CINT にかぶせる形ではなく、CINT を取り込んでの環境提供の様子。
フリーの場合、起動時毎回メッセージを表示してくるので「ちと」ウザイ。
対応OSは、win95 とwin98(動作確認済) NT(未確認) とのことだが、w2k(起動後エラー発生...) 以降での動作確認が取れていない。
98 で動かしてみたところ、CINT を直接使用するより遥かに使い勝手がよい。
ダウンロード先:http://www.vector.co.jp/soft/win95/prog/se075910.h... (取合可能...)
※作者サイトはすでに閉鎖?
すべてメニュー操作(ボタン無)なのでちと不便。
直接 .cpp .c ファイル読み込み実行ではなく、オリジナルなプロジェクトを作成する必要があるようである。これも不便。(vc++ TC++ などの統合環境と手間が同じでは...)
まったくの初心者が、初心者用のプログラムの勉強をする程度なら手軽でよい。
▲上へ 編集
2008年07月14日(月) 13:09:44 Modified by cafeboy1