演算子が作用する変数をオペランド (Operand) という. 一つのオペランドをとる演算子を [単項演算子] (Unary Operator), 二つのオペランドを取る演算子を [二項演算子] (Binary Operator), 三つのオペランドをとる演算子を [三項演算子] と言う. これまで見た演算子の内, sizeof 演算子は単項演算子, 単純代入演算子は二項演算子である.
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]
条件演算子 (Conditional Operator):
式 1 ? 式 2 : 式 3
if(式 1){
式 2
}else{
式 3
}
典型的な例は, 二つの変数の最大値を求めるものである:
x > y ? x : y