算術変換と整数の昇格

算術変換
2項演算子に異なる型のオペランドを指定した場合、「精度の高い」ほうに型を揃えてから演算が行われる。
制度の高い順に
long double>double>float>unsigned long>long>unsigned int>int
となる。
※longとunsigned intの場合はunsigned longになる。

整数の昇格
int型よりもサイズの小さい整数は、演算の前に無条件に符号付int型に変換される。

原則

・ビットフラグなど、ビット単位の情報が重要なものは
符号無し整数にする。
・配列の要素数が多いなど、サイズが重要な場合には
できるだけ小さいデータ型にする。
・さもなければint


何かの個数や人の年齢といった値は負になる事が無い為、符号無し整数にしたくなるかも知れません。
しかし、こうした変数はintにしておく事で、余計な型変換を防ぐ事ができます。
また、charやshortを使用すると、整数の昇格によって余計な変換が発生する分だけ遅くなります。
C > 演算 | comments (0) | trackbacks (0)

and演算での剰余演算


#include <stdio.h>
void main()
{
 int i;
 for ( i=0; i<16; i++ ) printf( "%d ", i % 2 );
 printf( "\n" );
 for ( i=0; i<16; i++ ) printf( "%d ", i & 1 );
 printf( "\n" );
 for ( i=0; i<16; i++ ) printf( "%d ", i % 4 );
 printf( "\n" );
 for ( i=0; i<16; i++ ) printf( "%d ", i & 3 );
 printf( "\n" );
 for ( i=0; i<16; i++ ) printf( "%d ", i % 8 );
 printf( "\n" );
 for ( i=0; i<16; i++ ) printf( "%d ", i & 7 );
 printf( "\n" );
 for ( i=0; i<16; i++ ) printf( "%d ", i % 16 );
 printf( "\n" );
 for ( i=0; i<16; i++ ) printf( "%d ", i & 15 );
 printf( "\n" );
}


実行結果

0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3
0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7 0 1 2 3 4 5 6 7
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15


i % (n2) は i & (n2-1) と同じである。
C > 演算 | comments (0) | trackbacks (0)

関数の記憶クラス

・関数に指定できるクラスはstaticとexternのいずれかである。
・static記憶クラスを持つ関数は、その関数が定義されているファイル内の関数からのみ呼び出す事ができる。
 他のファイルの関数からstatic関数を呼び出すことはできない。
・extern記憶クラスを持つ関数は、他のファイルの関数から呼び出す事ができる。
 関数の記憶クラスを省略した場合はexternが暗黙的に採用される。
・特定のファイル内の、特定の処理に特化した独立性の低い関数の場合は、名前の競合を避ける為にstatic記憶クラスを指定する事が推奨される。
C > 関数 | comments (0) | trackbacks (0)

typedef

構文
typedef 既存の型名 新しい型名


typedef struct { int x, int u } Point;


・構造体の宣言でタグ名は省略できるため、
 必要でなければ無名構造体に別名を与えた方が効率的である。
・構造体に別名を与えておくと、structキーワードを指定する必要がなくなり、
 構造体変数の宣言が簡単になる。
C > 基礎 | comments (0) | trackbacks (0)

enum

構文
enum タグ名 {
 列挙子1 = 定数, 列挙子2 = 定数 ...
} 列挙変数;



enum { MSG_OK, MSG_YESNO };
enum { ID_OK = 1, ID_YES, ID_NO };


タグ名と末尾の列挙変数の宣言は、構造体や共用体と同じように
省略することができる。


#include <stdio.h>

void main()
{
 enum { Sun,Mon,Tue };

 int x = Sun;
 switch ( x ) {
 case Sun:
  printf( "日曜日の処理" );
  break;
 case Mon:
  printf( "月曜日の処理" );
  break;
 case Tue:
  printf( "火曜日の処理" );
  break;
 }
}

C > 基礎 | comments (0) | trackbacks (0)

論理演算子

論理和
A||B

論理積
A&&B

否定
!A

排他的論理和
(A||B)&&!(A&&B)


・優先順位は!&&||となります。
&&||は左から右に評価されることが保証されています。
 そして条件が一致すれば、そこで条件判定を中止します。
 ですから合致する確率の高い条件を最初に記述した方が処理効率が良くなります。
C > 演算 | comments (0) | trackbacks (0)