c语言关键字,数据类型,运算符(一)
第一个c语言程序
#include<stdio.h> //双斜杠为注释,头部文件比有
int main() //main函数必有,程序必有
{ //(),{},[],""必须成对出现,且是英语符号
printf("hellow c\n"); //语句一定要以分号结束
return 0;
}
/*
这是多行注释
*/
关键字
用于定义变量或者类型
类型 变量名;
char 、short、int 、long 、float、double、
struct、union、enum 、signed、unsigned、void
register、static、const、auto、extern
if 、else 、break、continue、for 、while、do、switch case、goto、default
sizeof、typedef、volatile
char 字符型 用来定义字符型变量 占一个字节 char ch=‘a’;
short 短整型 用来定义短整型变量,占连个字节 short a=11;-32768 - —32767
int 整形 定义整形变量 在32 位系统下占4 个字节,在16 平台下占2 个字节 int a=13;-20 亿—20 亿
long 长整形 定义长整型变量,在32 位系统下占4 个字节,long int a=45;
float 单浮点型, 定义的变量是单浮点型的实数,占4 个字节 float a=1.2f;
double 双浮点型,定义的变量是双浮点型的实数,占8 个字节 double a=3.4;
struct 定义结构体类型
union 与共用体(联合体)相关
enum 与枚举类型相关
signed 有符号的意思,正负,在定义char 、整型(short int long) 数据的时候用signed 修饰,默认是已经加上修饰了,即定义整形数据时默认是有符号的数据。
unsigned 无符号的意思,在定义char 、整型(short 、int、long) 数据的时候用unsigned 修饰,修饰定义数据时,数据只能是正数和0;
void 不能定义变量,没有void 类型的变量,void 是用来修饰函数的参数或者返回值
register 是寄存器的意思,用register 修饰的变量是寄存器变量
static 静态,可以修饰全局变量、局部变量、函数
const 常量,修饰的变量是只读的,不能修改它的值
auto 关键字现在基本不用
extern 是外部的意思,一般用于函数和全局变量的声明
sizeof 使用来测变量、数组的占用存储空间的大小(字节数)
typedef 重命名相关的关键字
volatile 易改变的意思,定义的变量,是易改变的,即告诉cpu 每次用volatile 变量的时候,重新去内存中取保证用的是最新的值,而不是寄存器中的备份
变量命名规则:在c 语言中给变量和函数起名的时候,由字母、数字、下划线构成
必须以字母或者下滑线开头
数据类型
char 、short int 、int、long int、float、double
字符与字符串;‘a’是字符,”a“是字符串,双引号的字符串自动的添加一个结束标志位’\0’,即“a”包含两个字符‘a’和’\0’
指数形式:123e3 代表123*10 的三次方,123e-3代表123*10-3次方,
float与double:不以f 结尾的常量是double 类型,以f 结尾的常量(如3.14f)是float 类型
格式化输出字符
%d 十进制有符号整数 %u 十进制无符号整数
%x, 以十六进制表示的整数 %o 以八进制表示的整数
%f float 型浮点数 %lf double 型浮点数
%e 指数形式的浮点数
%s 字符串 %c 单个字符
%p 指针的值
%3d:要求宽度为3 位,如果不足3 位,前面空格补齐;如果足够3 位,此语句无效
%03d:要求宽度为3 位,如果不足3 位,前面0 补齐;如果足够3 位,此语句无效
%-3d: 要求宽度为3 位,如果不足3 位,后面空格补齐;如果足够3 位,此语句无效
%.2f:小数点后只保留2 位
数据类型的自动转换
数据转换的方向:内存字节数少(值域小)的类型,向占用内存字节数多(值域大)的类型转换
当表达式中出现了char 、short int 、int 类型中的一种或者多种,没有其他类型了
参加运算的成员全部变成int 类型的参加运算,结果也是int 类型的
当表达式中出现了带小数点的实数,参加运算的成员全部变成double 类型的参加运算,结果也是double 型。
当表达式中有有符号数也有无符号数,参加运算的成员变成无符号数参加运算结果也是无符
号数.(表达式中无实数)
在赋值语句中等号右边的类型自动转换为等号左边的类型
数据类型的强制转换
通过类型转换运算来实现,把表达式的运算结果强制转换成类型说明符所表示的类型:(类型说明符) (表达式)
(float)a; // 把a 的值转换为float型
(double)(x+y); // 把x+y 的结果值转换为double型
#include<stdio.h>
typedef short int int16;
int main()
{
char a = 'j'; //char a='12'是不对的12占两个字符
char b[] = "caixukun"; //定义字符串
int16 c = -14;
float d = 4.3f;
double e = -4.3; //默认定义的是有符号数
unsigned int f = 12;
printf("a=%c,%d\n", a,sizeof(a));
printf("b=%s,%d\n",b,sizeof(b)); //9个字节包含结尾的\0’
printf("c=%d,%d\n", c, sizeof(c));
printf("c=%f,%d\n", d, sizeof(d)); //4字节
printf("c=%lf,%d\n", e, sizeof(e)); //8字节
printf("%d\n",5/2); //5/2的实际类型为int
printf("%lf\n", 5.2/2); //5.2/2的实际类型为double
printf("%d\n", (c + f)); //值是-2
if (c+f<0)
{
printf("c和f的和是负数");
}
else
{
printf("c和f的和是正数"); //if语句输出是正数,说明表达式最后得到一个无符号数
}
return 0;
}
运算符
单目运算符:参加运算的操作数只有一个
++自增运算符给变量值+1;–自减运算符给变量值减一
#include<stdio.h>
int main()
{
int a;
int num;
a = 1;
//num = (a++) + (a++) + (a++);
//printf("%d\n", a); 结果是4,a的数值变化是2,3,4
//printf("%d\n",num); 结果是3,(a++)先去出a的值,先取值1+1+1,后++的运算
/*
num = (++a) + (++a) + (++a);
printf("%d\n", a); //4
printf("%d\n", num); //12 先++a运算,4+4+4
*/
/*num = a++;
printf("%d\n", a); //2
printf("%d\n", num); //1 先去值,后运算
*/
printf("%d\n%d\n%d\n", (a++), (a++),(a++));//3,2,1
//printf("%d\n%d\n%d\n", (++a), (++a),(++a));4,4,4
return 0;
}
双目运算符:即参加运算的操作数有两个例如+ - * /
三目运算符:即参加运算的操作数有3 个;(a)?(b):©,a条件为真,提供b的结果,否则提供c的结果
算数运算符:+ - * / %(取余) += -= *= /= %=
a*=2 就是a=a*2
关系运算符:>、<、= =、>=、<=、!= (不等于)
逻辑运算符:&& 逻辑与;|| 逻辑或;! 逻辑非
位运算符:&按位与,| 按位或,~ 按位取反,^ 按位异或
>>右移
逻辑右移高位补0,低位溢出;
算数右移高位补符号位,低位溢出(有符号数
左移<< 高位溢出,低位补0
正数在内存中以原码形式存放,负数在内存中以补码形式存放
正数的原码=反码=补码
负数的反码是将原码中,除符号位(最高位)以外,每一位取反。负数的反码+1 就是补码。
如int型数值2的占4个字节,原码为
0000 0000 0000 0000 0000 0000 0000 0010 (2)
-2的反码为
1111 1111 1111 1111 1111 1111 1111 1101
-2的补码为
1111 1111 1111 1111 1111 1111 1111 1110 (ff ff ff fe)
#include<stdio.h>
int main()
{
printf("%x\n", 2); //2
printf("%x\n", -2); // ff ff ff fe
return 0;
}
优先级
if语句
几种形式
形式1
if(判断语句)
{
语句A;
}
形式2
if(判断语句)
{
语句A;
}
else
{
语句B;
}
形式3
if(判断语句)
{
语句A;
}
else if(判断语句)
{
语句B;
}
… //可多个else if
else
{
语句n
}
在使用if判断的时候,从上往下判断,一旦有成立的表达式,执行对应的复合语句,
下边的就不再判断了,各个条件判断是互斥的
#include<stdio.h>
int main()
{
int a = 4;
if (a>=5)
{
printf("a是大于等于5的数");
}
else if (a>3)
{
printf("a大于3,小于5");
}
else
{
printf("小于等于3");
}
return 0;
}
也可以if里面嵌套if
int main()
{
int a = 4;
if (a<=5)
{
if (a==3)
{
printf("a等于3");
}
else if (a==4)
{
printf("a=4");
}
}
else
{
printf("a大于5");
}
return 0;
}
switch 语句
switch(表达式)//表达式只能是字符型或整型的(short int int long int)
{
case 常量表达式1:
语句1;
break;
case 常量表达式2:
语句2;
break;
default:语句3;break;
}
#include<stdio.h>
int main()
{
int a = 1;
switch (a)
{
case 5:
printf("a是5");
break;
case 2:
printf("a是2");
break;
case 1:
printf("a是1");
break;
default:
printf("不知道a是几");
break;
}
return 0;
for循环
形式
for(表达式1;表达式2;表达式3)
{//复合语句,循环体
}
执行表达式1,表达式1 只执行一次,
表达式2,每次循环前执行表达式2,判断表达式为真时才执行循环体
执行完循环体后,执行表达式3
#include<stdio.h>
int main() //1到5的和
{
int i, sum = 0;
for (i = 0; i <= 5; i++)
{
sum = sum + i;
}
printf("%d\n", sum);
}
for循环嵌套
#include<stdio.h>
int main()
{
int i, j;
for (i = 1; i <= 9; i++)
{
for (j = 1; j <= i; j++)
{
printf("%d*%d=%d\t", j, i, j * i);
}
printf("\n");
}
return 0;
}
break与continue
#include<stdio.h>
int main()
{
int i, sum = 0;
for (i = 0; i <= 5; i++)
{
if (i == 2)
{
//break; //中断循环
continue; //中断本次循环,开始下一循环
}
printf("%d\n", i);//break语句i只输出到1输出(0,1),continue语句会跳过输出2,输出(0,1,3,4,5)
}
}
while循环
形式1
while(条件表达式)
{//循环体,复合语句
}
#include<stdio.h>
int main() //1到100的和
{
int i = 1, sum=0;
while (i<=100)
{
sum = sum + i;
i++;
}
printf("%d", sum);
}
形式2
do
do{//循环体
}while(条件表达式);
#include<stdio.h>
int main()
{
int i = 1, sum=0;
do
{
sum = sum + i;
i++;
} while (i <= 100);
printf("%d", sum);
}
区别:do执行循环体在判断是否执行第二次循环体,while先判断
goto跳转
#include<stdio.h>
int main()
{
printf("1\n");
printf("2\n");
goto tiaozhuan; //跳过打印4,5
printf("4\n");
printf("5\n");
tiaozhuan:
printf("6\n");
printf("7\n");
printf("8\n");
}