式 (Expressions)

演算子が作用する変数をオペランド (Operand) という. 一つのオペランドをとる演算子を [単項演算子] (Unary Operator), 二つのオペランドを取る演算子を [二項演算子] (Binary Operator), 三つのオペランドをとる演算子を [三項演算子] と言う. これまで見た演算子の内, sizeof 演算子は単項演算子, 単純代入演算子は二項演算子である.

整数拡張と通常の算術型変換

整数拡張 (Integer Promotions)

通常の算術型変換 (Usual Arithmetic Conversion)

四則演算子 +, -, *, /, %

arith.c

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#include <stdio.h>

int main(void){
  unsigned char c = 'w';

  printf("%c (%d)\n", c, c);

  c = c + 'A' - 'a';

  printf("%c (%d)\n", c, c);

  return 0;
}

arith.c の実行結果は:

[cactus:~/code_c/c_tuts]% ./arith
w (119)
W (87)

arith2.c

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#include <stdio.h>

int main(void){
  long long l = 111111111LL, m = 0LL;

  m = l * l;
  printf("%lld\n", m);

  m = m % 11;
  printf("%lld\n", m);

  return 0;
}

arith2.c の実行結果は:

[cactus:~/code_c/c_tuts]% ./arith2
12345678987654321
1

キャスト演算子 ()

cast.c

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
#include <stdio.h>

int main(void){
  int n1 = 256;
  int n2 = 500;

  printf( "%u\n", (unsigned char)n1 ); // 256 - (255 + 1) = 0
  printf( "%u\n", (unsigned char)n2 ); // 500 - (255 + 1) = 244
  
  return 0;
}

cast.c の実行結果は:

[cactus:~/code_c/c_tuts]% ./cast
0
244

cast2.c

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#include <stdio.h>

int main(void){
  int a = 10, b = 3;
  float x;

  x = a / b;
  printf("(1) x = %f\n", x);

  x = (float)a/b;
  printf("(2) x = %f\n", x);

  return 0;
}

cast2.c の実行結果は:

[cactus:~/code_c/c_tuts]% ./cast2
(1) x = 3.000000
(2) x = 3.333333

関係演算子 <, <=, ==, !=, >=, >

relation.c

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>

int main(void){
  int x = 2, y = 3;
  int d = 0;

  printf("x = %d, y = %d\n", x, y);

  d = (x > y);
  printf("x > y\t%d\n", d);

  d = (x >= y);
  printf("x >= \t%d\n", d);

  d = (x < y);
  printf("x < y\t%d\n", d);

  d = (x <= y);
  printf("x <= y\t%d\n", d);

  d = (x == y);
  printf("x == y\t%d\n", d);

  d = (x != y);
  printf("x != y\t%d\n", d);

  return 0;
  
}

relation.c の実行結果は:

[cactus:~/code_c/c_tuts]% ./relation
x = 2, y = 3
x > y  0
x >=   0
x < y  1
x <= y 1
x == y 0
x != y 1

論理演算子 &&, ||, !

logica_op.c

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#include <stdio.h>

int main(void){
  int x = 0, y = 1;

  printf( "(1) !(!x && !y)\t = %d\n", !(!x && !y) );
  printf( "(2) x||y\t = %d\n", x || y);
  
  return 0;
}

logical_op.c の実行結果は:

[cactus:~/code_c/c_tuts]% ./logical_op
(1) !(!x && !y)                  = 1
(2) x||y  = 1

logica_op2.c

1
2
3
4
5
6
7
8
9
#include <stdio.h>

int main(void){
  char c = '\0'; // ヌル文字 '\0' は ASCII コード番号 0 の文字であり, それは 0 に等しい

  printf( "!'\\0' = %d\n", !c );
  
  return 0;
}

logical_op2.c の実行結果は:

[cactus:~/code_c/c_tuts]% ./logical_op2
!'\0' = 1

増分演算子 ++, 減分演算子

増分演算子 (インクリメント・オペレータ, Increment Operator):

++x  x を参照前に 1 を加算
x++  x を参照後に 1 を加算

減分演算子 (デクリメント・オペレータ, Decrement Operator):

--x  x を参照前に 1 を減算
x--  x を参照後に 1 を減算

incre.c

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#include <stdio.h>

int main(void){
  int m = 0, n = 5;

  m = n++; // n++ は m に代入後 1 増える.
  printf("m = %d, n = %d\n", m, n);

  n = 5;
  m = ++ n; // ++n は n が 1 に増えた後に m に代入される.
  printf("m = %d, n = %d\n", m, n);

  return 0;
}

incre.c の実行結果は:

[cactus:~/code_c/c_tuts]% ./incre
m = 5, n = 6
m = 6, n = 6

sum.c

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#include <stdio.h>

int main(void){
  int sum = 0;
  int i;

  for(i = 1; i <= 10; i++)
    sum += i;
  printf("sum = %d\n", sum);

  return 0;
}

sum.c の実行結果は:

[cactus:~/code_c/c_tuts]% ./sum
sum = 55

ビット演算子 <<, >>, &, |, ^, ~

bit.c

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#include <stdio.h>

int main(void){
  unsigned short x = 0, y = ~0;
  int n;

  printf("%u\t(%x)\t[%hu %hx]\n", x, x, ~x, ~x);

  for(n = 0; x != y; n++){
    x = x | (1<<n);
    printf("%u\t(%x)\t[%hu %hx]\n", x, x, ~x, ~x);
  }

  return 0;
}

bit.c の実行結果は,

0	(0)	[65535 ffff]
1	(1)	[65534 fffe]
3	(3)	[65532 fffc]
7	(7)	[65528 fff8]
15	(f)	[65520 fff0]
31	(1f)	[65504 ffe0]
63	(3f)	[65472 ffc0]
127	(7f)	[65408 ff80]
255	(ff)	[65280 ff00]
511	(1ff)	[65024 fe00]
1023	(3ff)	[64512 fc00]
2047	(7ff)	[63488 f800]
4095	(fff)	[61440 f000]
8191	(1fff)	[57344 e000]
16383	(3fff)	[49152 c000]
32767	(7fff)	[32768 8000]
65535	(ffff)	[0 0]

複合代入演算子 op=

x = x + y;

x += y;

op に適用可能な演算子:

+ - * / % >> << & ^ |

条件演算子 ? :

条件演算子 (Conditional Operator):

式 1 ? 式 2 : 式 3

if(式 1){
  式 2
}else{
  式 3
}

典型的な例は, 二つの変数の最大値を求めるものである:

x > y ? x : y