目录
一.基本数据类型
#include <stdio.h>
int main()
{
printf("sizeof(short) = %d\n",sizeof(short)); //2
printf("sizeof(int) = %d\n",sizeof(int)); //4
printf("sizeof(long) = %d\n",sizeof(long)); //4
printf("sizeof(float) = %d\n",sizeof(float)); //4
printf("sizeof(double) = %d\n",sizeof(double)); //8
char c = 255;
printf("%d\n",c); //-1
int a = -20;
unsigned int b = 10;
printf("%d\n",a+b);//-10
printf("sizeof(1.0) = %d\n",sizeof(1.0)); //8
printf("sizeof(1.0l) = %d\n",sizeof(1.0l)); //12
printf("'a' = %d,'0' = %d\n",'a','0'); //97,48
char ch1 = '\101'; //A
char ch2 = '\x41'; //A
printf("ch1 = %c,ch2 = %c\n",ch1,ch2);
printf("'\101','\x41'\n"); //A A
printf("Please enter \"Y\" or \"N\": \n"); //Please enter "Y" or "N":
return 0;
}
(一)常量
1.char c = 255; printf("%d\n",c);
知识点:(1)正数以原码形式存在 负数以补码形式存在
(2)原码到补码的转换 和 补码到原码的转换 都是取反+1(二进制)
(3)最高位用来判断数的正负,不参与运算 。0为正数 1为负数
255的二进制表示为:1111 1111 (最高为1,则是负数,负数以补码的形式存在,则化为原码 取反+1)
取反高位不参与运算 :1000 0000
+1 :1000 0001
得到结果 :printf("%d\n",c)为 -1
2.常用ASCII码:
‘0’ 48 ‘A’ 65 ‘a' 97
也可用八、十六进制表示如:’0‘ 十进制:48 八进制:’\60‘ 十六进制:’\x30‘
3.实数型:由整数和小数形成,可忽略其一
十进制: 35.(35.0) .689 (0.689) 都是double型
指数形式:在小鼠后面加E/e表示指数,指数部分必须是整数
1e-2 (1*10^-2) 0.5E10 (0.5*10^10) 都是double型
1e-2f (float型) 3.2L (long double型)
4.常用转义字符:\n 换行 \r 回车
windows中的Enter等于\n\r(既回车又换行)
5. printf("Please enter \"Y\" or \"N\": \n"); //Please enter "Y" or "N":
(二)变量
1.变量名/用户标识符的命名规范:
(1)以字母或下划线开头,由数字,字母,下划线组成。
(2)区分大小写的。如:A1与a1是不同的标识符。
(3)不能采用关键字int,float等。
2.变量如果不初始化,内存单元可能保留着先前的内容
3.单精度实型提供7位有效数字,双精度实型提供15~16位有效数字。
如:float a;
a=111111.111 (最后两位小数不起作用)一共9个有效数字
而:double a;
a=111111.111 (全部接收)
#include <stdio.h>
int main()
{
float a,b;
a = 123456.789e5;
b = a + 20;
printf("a = %f,b = %f\n",a,b);
return 0;
}
//结果为a = 12345678848.000000,b = 12345678848.000000
//实际应为12345678920
1234567是float能接受的 余下的都无意义
4.字符串
字符串都是以\0结尾的,所以空字符串实际上有一个字符:\0
二.运算符与表达式
优先级 |
运算符 |
名称或含义 |
使用形式 |
结合方向 |
说明 |
1 |
[] |
数组下标 |
数组名[常量表达式] |
左到右 |
-- |
() |
圆括号 |
(表达式)/函数名(形参表) |
-- |
||
. |
成员选择(对象) |
对象.成员名 |
-- |
||
-> |
成员选择(指针) |
对象指针->成员名 |
-- |
||
|
|||||
2 |
- |
负号运算符 |
-表达式 |
右到左 |
单目运算符 |
~ |
按位取反运算符 |
~表达式 |
|||
++ |
自增运算符 |
++变量名/变量名++ |
|||
-- |
自减运算符 |
--变量名/变量名-- |
|||
* |
取值运算符 |
*指针变量 |
|||
& |
取地址运算符 |
&变量名 |
|||
! |
逻辑非运算符 |
!表达式 |
|||
(类型) |
强制类型转换 |
(数据类型)表达式 |
-- |
||
sizeof |
长度运算符 |
sizeof(表达式) |
-- |
||
|
|||||
3 |
/ |
除 |
表达式/表达式 |
左到右 |
双目运算符 |
* |
乘 |
表达式*表达式 |
|||
% |
余数(取模) |
整型表达式%整型表达式 |
|||
4 |
+ |
加 |
表达式+表达式 |
左到右 |
双目运算符 |
- |
减 |
表达式-表达式 |
|||
5 |
<< |
左移 |
变量<<表达式 |
左到右 |
双目运算符 |
>> |
右移 |
变量>>表达式 |
|||
|
|||||
6 |
> |
大于 |
表达式>表达式 |
左到右 |
双目运算符 |
>= |
大于等于 |
表达式>=表达式 |
|||
< |
小于 |
表达式<表达式 |
|||
<= |
小于等于 |
表达式<=表达式 |
|||
7 |
== |
等于 |
表达式==表达式 |
左到右 |
双目运算符 |
!= |
不等于 |
表达式!= 表达式 |
|||
|
|||||
8 |
& |
按位与 |
表达式&表达式 |
左到右 |
双目运算符 |
9 |
^ |
按位异或 |
表达式^表达式 |
左到右 |
双目运算符 |
10 |
| |
按位或 |
表达式|表达式 |
左到右 |
双目运算符 |
11 |
&& |
逻辑与 |
表达式&&表达式 |
左到右 |
双目运算符 |
12 |
|| |
逻辑或 |
表达式||表达式 |
左到右 |
双目运算符 |
|
|||||
13 |
?: |
条件运算符 |
表达式1? 表达式2: 表达式3 |
右到左 |
三目运算符 |
|
|||||
14 |
= |
赋值运算符 |
变量=表达式 |
右到左 |
-- |
/= |
除后赋值 |
变量/=表达式 |
-- |
||
*= |
乘后赋值 |
变量*=表达式 |
-- |
||
%= |
取模后赋值 |
变量%=表达式 |
-- |
||
+= |
加后赋值 |
变量+=表达式 |
-- |
||
-= |
减后赋值 |
变量-=表达式 |
-- |
||
<<= |
左移后赋值 |
变量<<=表达式 |
-- |
||
>>= |
右移后赋值 |
变量>>=表达式 |
-- |
||
&= |
按位与后赋值 |
变量&=表达式 |
-- |
||
^= |
按位异或后赋值 |
变量^=表达式 |
-- |
||
|= |
按位同或后赋值 |
变量|=表达式 |
-- |
||
|
|||||
15 |
, |
逗号运算符 |
表达式,表达式,… |
左到右 |
-- |
说明:
同一优先级的运算符,运算次序由结合方向所决定。
简单记就是:自增自减 > ! > 算术运算符 > 关系运算符 > && > || > 条件运算符 > 赋值运算符 > 逗号运算符
(一)6类基本运算符和表达式
1.算术运算符和算术表达式
* 、/、% 优先级相同高
+、- 优先级相同低
数据参加运算前要进行下列转换:
char,short→int→float→double
混合运算时数据类型由低级→高级
unsigned → int → long → double
以上并不意味着unsigned必须到int再到long的依次转换,而是由算式中的*进行转换的。
例如: 若有 int i, float f, double d, long e
则 10+'a'+i*f-d/e 表达式运算次序为:
①将'a' --> 97,然后10+'a'运算。(char --> int)
② 将 i--> float型,然后i*f运算。 (int --> float)
③ 将 ①的结果 -- > float型,然后与 ②的结果相加。(int --> float)
④ 将e-->double型,然后d/e运算。(long --> double)
⑤ 将 ③的结果转换为double型,然后与减 ④的结果。(float --> double)
结论:当两个数据运算时类型不同,则将运算类型低的转化为运算类型高的后再运算,运算结果为类型高的数据。
2.赋值运算符和赋值表达式
(1)赋值符号:= 将赋值符右边表达式的值赋给赋值符左边的一个变量。
(2)赋值运算符的数据类型若不一致,则要进行类型转换。转换方式为:
- 将实型数据-->整型变量,舍弃实数的小数部分。
如:int i; i=5.65; i 的值为 5。
- 将整型数据-->实型变量,数值不变。
float f ; f=23; (先23→23.00000 再存储在f 中)
double d; d=23; (先23→23.000000000000000再存储在d中)
- 将字符数据-->整型变量,将字符数据放到整型变量低8位中
int i;char ch = '0'; i = ch; // i = 48
- 将整型变量->字符数据,将整型变量低8位放到字符数据中
int i = 4656;char ch; ch = i; // ch = 48
解释:4656转换为二进制为:1 0010 0011 0000 整型占4字节 字符占1字节(8位)
低8位放到字符数据中:0011 0000 转换为十进制就是48
(3)复合的赋值运算符:(共十个)
+= , -= , *= , /= , %= ,
<<= , >>= , &= , ^= , |=
(4)赋值运算符结合率为:“自右而左”。
例如: a=b=c=5 a=(b=(c=5)) a,b,c值都是5
a=5+(c=6) c值为6, a值为5+6 (即11)
a=(b=4)+(c=6) b值为4,c值为6,a值为4+6 (即10)
a=(b=10)/(c=2) a值为5
(5)练习
a+=a–=a*a
若 a为5,则赋值表达式的值为?
答案:–40。
计算方法:
a+=(a- =a*a)
a=a-a*a (即a= 5-5*5,即a=-20)
a=a+(上述表达式结果)
即a= (-20)+(-20)
即a= - 40
3.关系运算符和关系表达式
(1)关系运算符用于两个数值之间的比较运算。C语言提供6种关系运算符:
<、<=、>、>=、 优先级相同高
==、!= 优先级相同低
(2)关系运算符的结合率为:“自左而右”。
c > a+b 等效于 c > (a+b)
a > b != c 等效于 (a > b) != c
a == b < c 等效于 a == (b < c)
a = b > c 等效于 a = (b > c)
(3)关系表达式的值是一个逻辑型的值,即只有两个值(真和假)。
C语言是用1作为真,用0作为假。但是进行运算时,非0即认为真,0才认为假。
而表达式的结果为真时,给出真值1。为假时,给出假值0。
例1:有int x=2,y=3,z=5;
则:x>y 结果为0。
z>=y 结果为1。
z==y 结果为0。
4.逻辑运算符和逻辑表达式
(1)优先级: !>&&>||
用逻辑运算符将关系表达式或逻辑量连接起来的式子。
运算结果为:“真”或“假”值。
系统在运算时以非0即为真,以0为假。
例如: 4 && 0 || 2 的值为1
5 && !0 的值为1
逻辑、关系、算术和赋值运算符的优先级为:
例如:(a>b)&&(x>y) 可以写成 a>b&&x>y
(a==b)||(x==y) 可以写成 a==b||x==y
(!a)||(a>b) 可以写成 !a||a>b
5>3&&2||8<4-!0 的值为 1
'c'&&'d' 的值为 1
5.条件运算符和条件表达式
条件运算符: ? : 它是唯一的一个三目运算符。
6.逗号运算符和逗号表达式
逗号运算符: ,
格式: 表达式1, 表达式2, 表达式3, LL, 表达式n
优先级: 最低
从左向右计算每个表达式的值,逗号表达式的值为表达式n的值(最后一个逗号右边的值)
(二)自增自减运算符
自增、自减运算符:++ , -- (使变量的值增1或减1)
例如: ++i , --i (先自增或自减再使用)
i++ , i-- (先使用后自增或自减)
若有 int i=3,j; 则:
① j=++i; i的值为3+1 即4 , j的值为4;
② j=i++; j的值为3 , i的值为3+1=4 。
又如:i=3;
printf("%d",++i); /*输出为4*/
printf ("%d", i++); /*输出为3*/
例如:
- z = i+++j; i = 1,j = 2则i = ?,j = ?z = ?
z = (i++) + j i = 2 j = 2 z = 1 + 2 = 3
- z = x++, y++, ++y; x = 1, y = 1;则 x = ?,y = ?,z = ?
x = 2 y = 2 z = 1,1,3 z = 3
- j = ++i + ++i + ++i; i = 1; j = ?
j = 10
三.数据输入输出
(一)数据输出
1.putchar()函数
功能:向终端输出一个字符。
格式: putchar (ch)
#include <stdio.h>
int main()
{
char a,b,c;
a='B';b='O';c='Y';
putchar(a);
putchar(b);
putchar(c);
putchar('\n');
}
结果:BOY(换行)
2.printf()函数
%【+/-】【0】【l】【m.n】【格式字符】
【0】不指定时:位置空白,指定时,不使用的位置用0代替
【+/-】设置输出的结果的对齐方式 +:是默认的方式可不写 右对齐 -:左对齐
#include <stdio.h>
int main()
{
int a = -1;
printf("%d,%u,%o,%x\n",a,a,a,a);//-1,2^32-1,37777777777,ffffffff
int b = 12;
printf("%5d\n",b);// 12
int c = 123456;
printf("%5d\n",c);//123456
float af = 1.12345;
printf("%5.2f\n",af);// 1.12
return 0;
}
结果:
- -1,4294967295,37777777777,ffffffff
4294967295的二进制为:32个1 -1(负数高位为1 以补码形式存在)的二进制为1000 0000 ... 0001 取反加一(得原码)为32个1 37777777777 八进制 ffffffff 十六进制
- 12
(空三个)12
- 123456
数据宽度超出规定宽度仍能正常打印
- 1.12
(空一个)12 小数点也算一个宽度
%4.2 %3.2 %2.2 ... 都可以输出12
(二)数据输入
1.getchar()函数
功能: 从输入设备输入一个字符。
格式: getchar ()
#include <stdio.h>
int main()
{
char c;
c=getchar();
putchar(c);
}
输入:12 输出:1
2.scanf()函数
功能:输入若干个任意类型的数据。
格式:scanf("格式控制",参数1,参数2,参数3, LL)
格式说明:由%后跟一个格式字符组成。中间可插入l、h、m、*几个附加字符。
普通字符:照原样输入。
- 例1 :scanf("%3d%3d",&a,&b);
若输入数据格式为:123456
则将123赋给a,456赋给b。
- 例2:scanf("%c%c%c",&c1,&c2,&c3);
若输入数据格式为: a b c
则将a赋给c1 空格赋给c2,b赋给c3。
- 例3:scanf("%d%c%f",&a,&b,&c);
若输入数据格式为:1234a123o.26
a:1234 b:a c:123
- 例4:scanf("%2d %*3d %2d",&a,&b);
若输入数据格式为: 12 345 67
则将12赋给a, 67赋给b。