ロベールのC++入門講座(0)

ロベールのC++入門講座

ロベールのC++入門講座

flush(p39)

標準出力の最後には必ずflushもしくはendlを付ける。

cout << "Hello, World" << flush
Makefile(p53)

makeコマンド用ファイル(Makefile)

Hello: Hello.cpp
	g++ -o Hello Hello.cpp
Foo: Foo.cpp Bar.h
	g++ -o Foo Fpp.cpp

指定無しだと一番上のタスクが実行される。

$ make
g++ -o Hello Hello.cpp
$ make Foo
g++ -o Foo Fpp.cpp
void(p67)

Cの場合、引数なしでもint hoge(void)と書くのが無難。
(付録C)
関数定義ではint hoge()でもint hoge(void)とみなされるが、関数宣言では引数情報が不明と判断され、可変個引数に似たような扱いになってしまう。
安全の為にvoidを書こう。

for文での変数宣言(p90)

Cではforの初期化部分で変数宣言はできない。

#include <stdio.h>

int main(void) {
  for (int i = 0; i < 5; i++) {
    printf("%d\n", i);
  }
}
$ gcc Test.c
Test.c: In function ‘main’:
Test.c:4: error: ‘for’ loop initial declaration used outside C99 mode

でもエラー文にある通り、C99では可能。

$ gcc -std=c99 Test.c
$ ./a.out 
0
1
2
3
4
参照(p110)
  • Cには無いよ。あるのはアドレスを取り出す単項演算子&
  • 参照に代入できるのは変数のみ。
int& r = 3; //コンパイルエラー
  • 参照先の変更は不可

ってできるよ?(後で調べる)

int n[10];
n[1] = 5;
n[3] = 10;
int& r = n[3];
printf("%d\n", r);
r = n[1];
printf("%d\n", r);
char(p115)

'a'はC++ではchar、Cではint。

ヌル文字(p118)

文字コード0の文字=ヌル文字=文字列終端=ヌルターミネータ='\0'

sizeof演算子(p120)

sizeof演算子はバイト数をsize_t型(符号無し整数)で返す。
型名の場合は括弧必須。sizeof(int)
変数の場合は必要なし。sizeof foo

文字列走査イディオム(p122)
for (int i = 0; str[i] != '\0'; i++)
sprintf(p123)

印字しないのに何故に関数名がprint?(後で調べる)

乱数(p138)

srandで乱数種を設定し、randで求める。

true=1、false=0(p152)

true=1、false=0なので以下のようにしてnの符号が求められる。

//正:sign=1 負:sign=-1 0:sign=0
int sign = (n > 0) - (n < 0);
C99での論理値(p153)

C99では論理値が使える。

#include <stdio.h>
#include <stdbool.h>

int main(void) {
  bool a = true;
  if (a) {
    printf("true\n");
  } else {
    printf("false\n");
  }
}
$ gcc -std=c99 Test.c 
$ ./a.out 
true
$ gcc Test.c 
$ ./a.out 
true

C99モードでなくても使える?(後で調べる)

文字コードに対する要求(p153)

規格上、文字コードは0~9をこの順で連続させなければならない。

//数値である場合
if ('0' <= ch && ch <= '9') {
  //
}

//文字から数字に変更
int d = ch - '0';

でもアルファベット等の連続は規格では要求されていない。

//一部の環境では英字とは限らない
if ('A' <= ch && ch <= 'z') {
  //
}