二C言語基本データ型と演算子
#include <stdio.h>
int main()
{
char c1 = 'A';
char c2 = 97;
c1 = c1 + 1;
printf("c1=%c
",c1);//B
printf("c1=%d
",c1);//66
printf("c2=%c
",c2);//a
printf("c2=%d
",c2);//97
printf("sizeof(c1)=%d
",sizeof(c1));
char c3 = '9';
int i = c3-'0';
printf("i=%d
",i);
char c4 = -191;// -191 8
printf("c4=%c,c4=%d
",c4,c4);
return 0;
}/* : '9' 9*/
附:sizeof()用法:sizeof(タイプ)、sizeof(変数)、sizeof(式)が計算タイプ、変数のメモリサイズ(バイト単位)sizeof(式)の場合、式は演算せず、結果のみを推定し、使用を推奨しません.練習:小文字を入力し、対応する大文字に変換して出力します.
#include <stdio.h>
int main()
{
printf("
");
char c1, c2;
scanf("%c", &c1);
c2 = c1 - 'a' + 'A';
printf("c1 = %c, c2 = %c
", c1, c2);
return 0;
}
C言語には、エスケープ文字という特殊な文字があります.例えば、
改行文字''が成立
rリターンキャラクタリターンロー行の先頭に戻り、次の行の先頭に戻る
t水平タブビット(n個空)
\\ \’\? "4文字の特殊文字の表示
2>整数int(integer)
int整数型は2バイトまたは4バイトを表し,現在主流機器は4バイト(32ビットバイナリ)を表す.整形には、次のものが含まれます.
short int(略写short)短整型、2バイト
long int(略記long)ロング整数、4バイト
long long int(C 99)8バイト
unsigned int符号なし整数(負以外)
signed intシンボル整数(正負数)、デフォルト
整数はバイナリ、8進数、10進数、16進数で表すことができます.
整数型の原号表現法:
signed intの第1ビットはシンボルビットと見なされ、0は非負数を表し、1は負数を表し、表現範囲:負の2の31次から正の2の31次-1;
unsigned intは非負数であり、0から正の2の32次方-1を表す.
シンボルがあるのとないのはメモリの中で同じで、違いは第1位をどのように処理するかだけです.有符号数は第1位を符号ビットと見なし,演算に関与せず,無符号数は第1位を数字と見なし,演算に関与する.
#include <stdio.h>
int main()
{
int a = -1;
printf("unsigned a=%u,a=%d
",a,a);
unsigned int b = -1;
printf("unsigned b=%u,b=%d
",b,b);
return 0;
}
進数変換(バイナリ-->10進数)
16進法:0-9、10-15はa-f(A-F)で表される.
8進数、10進数、16進数のC言語での表現方法:
8進法は0で始まり、例えば011=8+1=9 int a=011である.
16進数は0 X/0 xで始まり、例えば0 xF 1=15*16+1=241 int a=0 xF 1である.
バイナリと10進数の変換:
正数2->10
0111 1011 = 64+32+16 +8+2+1 =112 + 11 = 123
0101 1101 = 64 + 16 + 8 +4 +1 = 93
正数10->2
108 -> 108 -64 = 44 -32 = 12 - 8 =4 -4 =0 -> 0110 1100
0 1 1 0 1 1 0 0
87 -> 87 - 64 = 23 -16 = 7 -4-2-1 -> 0101 0111
練習:0110 1011->107 125->0111 1101
負数10->2
対応する正数のバイナリ、それからビットによって逆を取って更に1(符号を補います)をプラスします
-107 -> 0110 1011 -> 1001 0100+1=1001 0101
- 58 -> 0011 1010 -> 1100 0110
負数2->10
まず1を減らしてからビットで逆を取って対応する正数を得て、前に-号を加えればいいです
ビットごとに逆を取って1を加えて対応する正数を得て、前に-号をプラスすればいいです
1101 1011 -> 1101 1010 -> 0010 0101 -> -37
1101 1011 -> 0010 0100+1 -> 0010 0101 -> -37
1111 1111 -> -1
練習:-77->0100 1101->1011 0011
1110 0111 -> 0001 1001 -> -25
3>浮動小数点タイプ
float単精度浮動小数点
ダブル精度浮動小数点
long double拡張デュアル精度(少ない使用)
浮動小数点数は小数であるが、浮動小数点は近似値(コンピュータストレージに関連)である.
注意:整数定数(フォント値)のタイプを指定します.
3 intとされる
3.5 doubleとみなされる
3.5 fはfloatと考えられる
3.5 Lはlong doubleとされています
35 Lはlong intとされている
35 LLはlong long intとされています
35 uはunsigned intとされる
35 ULはunsigned long
しかし、タイプはタイプ変換が可能で、タイプ変換は実はメモリの変化です.
2.C言語の演算子
1>演算子の優先度:
カッコの優先度が最も高い代入演算子(=)の優先度は極めて低い.
2>演算子:+-*/%(余剰を取る)
intを除いて、整数部分を取り、小数(小数部分を捨てる)がない.
%は整数でのみ使用でき、小数では使用できません.
intとdoubleを混合演算し、intをdouble演算に変換する.
0除数も余すこともできません.そうしないと、浮動小数点数の例外(実行エラー)を引き起こし、プログラムを中断します.
0.0は除数でき、結果はinf(無限大);
#include <stdio.h>
int main()
{
int a = 5, b = 2, c = 0;
double d1 = 2.0, d2 = 0.0;
printf("a/b=%d
", a / b);//2,3,2.5
printf("a%%b=%d
", a % b);//1
printf("a/d1=%lf
", a / d1);//2.0,2,5,2
//printf("a%%d1=%d
", a % d1);// ,
//printf("a/c=%d
", a / c);// ,
printf("a/d2=%lf
", a / d2);//a/d2=inf( )
printf("%d,%d,%d
", -9 / 7, -9 % 7, 9 % -7);//-1,-2,2 , (C99 )
printf("main over
");
return 0;
}
注:C 89では負数に関する/%は不確定であり、C 99では除算が0に整い、残りi%jの記号をiで決定する.
練習:92->29(整数の除算と余剰)などの2桁の逆順序印刷
#include <stdio.h>
int main()
{
int num, res = 0;
printf("
");
scanf("%d", &num);
res = num%10*10 + num/10;
printf("res=%d
", res);
return 0;
}
3>代入演算子(=)
代入演算子は、変数の値を変更できます.C言語では、++/--を除いて、変数の値は付与演算子でしか変更できません.代入演算子には、=+=-=*=/=...
a += b; -> a = a + b; 代入演算子は、右から左に計算されます.たとえば、次のようになります.
a=b=c= 0;//c=0->b=c->a=b; しかし、このような書き方はお勧めしません.付与演算子は、右の値を左の変数に割り当てるため、左は式ではなく、変数であることが望ましい.左は左値とも呼ばれます.
i+j = 10; 間違っています.左側は式10=iです.間違っています.左側は値で、10は定数で、値を割り当てることはできません.
4>自己増加および自己減少(++/--)
自己増加と自己減少は変数に対して、5++エラーです.++/--char、int、float、doubleタイプの変数に使用できますが、浮動小数点型変数は使用されません.
自増と自減には2つの用法があり、前++(++i)と後++(i++)はいずれも自増1である.しかし、前++は先に増分してから演算し、++の後の数で演算に参加する.後++先演算後自増,++前の数で演算に関与する.(前++は連用可能、後++は連用可能)
経験:i+/++iは単独で1つの文として現れ、他の文と混合しないでください.
#include <stdio.h>
int main()
{
int i=1,res;
double d = 1.0;
d++;
printf("d=%lf
",d);//2.0
printf("i++=%d
",i++);//1
printf("i=%d
",i);//2
printf("++i=%d
",++i);//3
printf("i=%d
",i);//3
//res = i++ + ++i;//8 4+4
//res = i++ + i++;//6 3+3
res = ++i + ++i;//10 5+5
printf("res=%d,i=%d
",res,i);
return 0;
}
5>論理式
リレーショナル演算子:>>=<<=
==等しいかどうか(=代入)
!= 等しくないかどうか
論理式の値は1(論理真,成立)または0(論理偽,不成立)である.しかし、C言語では、0以外は真であり、0は偽(変数、非論理式)である.
論理演算子は、真と偽(論理演算)について使用できます.
!ろんりひ
&&論理も(そして)も真で、結果は真で、さもなくば偽
論理も(あるいは)すべてうそで、結果はうそで、さもなくば本当です
アルゴリズムの最適化を行い、短絡効果があります.論理和に対しては,前が偽であれば,後は演算を行わず,論理または,前が真であれば,後は演算を行わない.
#include <stdio.h>
/*
*/
int main()
{
int i=0,j=0;
if(i++&&j++){}//if(0&&j++) j++
if(i--||j++){}//if(1||j++) j++
printf("i=%d,j=%d
",i,j);
return 0;
}
6>ビット演算子(標準のintとcharのみ)
ビットと&バイナリビットで演算(2つの整数)を行う2つのビットはすべて1で、結果は1で、さもなくば0
ビットまたは|バイナリビットによるまたは演算(2つの整数)両方のビットが0で、結果が0で、そうでない場合1
ビット反転~バイナリビットによる反転演算(1個の整数)ビット反転、~3+1=-3->~3=-4
ビットイソOR^バイナリビットによるイソOR演算(2個の整数)2個のビットが異なり、結果は1、そうでなければ結果は0
注意:
ビットと対応するバイナリビットを0にしてもよいし、対応する値を得ることもできる.ビットは111 0 111に0.
ビットまたは対応するバイナリビットを1にしてもよいし、対応する値を得ることもできる.ビットまたは000 1 000セット1.
ビットが異なるか、バイナリビットを反転できます.ビット異または000 1 000は反転できます.
#include <stdio.h>
int main()
{
int a=5,b=7;//0101 0111
printf("a&b=%d
",a&b);//0101=5
printf("a|b=%d
",a|b);//0111=7
printf("a^b=%d
",a^b);//0010=2
printf("~a=%d
",~a);//-6
printf("b<<2=%d,b>>2=%d
",b<<2,b>>2);//11100=28,0001=1
b=b&0xFFFFFFFB;//111... 1011=11=B
printf("b=%d
",b);
printf("%d
",(b&0x00000004)!=0);// b 1
return 0;
}
7>左シフトと右シフト演算
左シフト<<バイナリビットで左移動演算を行います.左シフト演算の場合、後ろの空席は0を補う
右シフト>>バイナリビットで右移動演算を行います.右シフト演算の場合、前の空席の場合:符号数が符号ビットを補い、符号数が0を補いません.
注意:左シフトは*2に相当し、右シフトは/2に相当するが、効率が高い.
8>&/*演算子
&アドレスを取る*アドレスに基づいて変数を取る
printfの%pはアドレスを出力するために使用されます.
アドレスはバイト番号で、アドレスを取って取得したのは変数の開始アドレスです.
9>トリプル演算子
(条件、論理値)?式1:式2----->条件が真の場合は式1、それ以外の場合は式2
int a = 10;
(a>10) ? 11 : 10 ; // a>10 11, 10
(a>10) ?9.0: 8; // 8.0, 。
a>b ? a:b // a,b
3.タイプ変換
1>浮動小数点と整数演算があり、自動的に浮動小数点に変換した後の演算;
2>int(char、short)未満の整数演算は、自動的にint後演算に変換される.
3>強制タイプ変換フォーマット:(ターゲットタイプ)()結果を格納するタイプ;
強制タイプ変換演算子(ターゲットタイプ)は省略できます.char c = (char) int;