目录
一、第一个c程序
#include<stdio.h>
//预处理指令 ,此为标准输入输出头文件
int main()
//主函数,一个程序有且只有一个 程序进入的入口
{
printf("Hello World");
// printf() 格式输出函数
return 0;
// 函数的返回值
}
结果:屏幕上打印出 Hello World
二、数据类型
c语言中的数据类型可以分为几类:
1、基本数据类型 :整形(整数),字符型,浮点型(小数)
2、构造数据类型:枚举类型,数组类型,结构体类型,共用体类型
3、指针类型:
4、空类型
数据类型 | 说明 | 字节 |
int | 整型 | 4 |
char | 字符型 | 1 |
float | 单精度浮点型 | 4 |
double | 双精度浮点型 | 8 |
常用整型 | 说明 | 字节 |
short(int) | 短整型 | 2 |
long(int) | 长整型 | 4 |
long long | 长长整型 | 8 |
注:int, short , long 是根据编译环境的不同,所取范围不同
c语言没有字符串类型,但是有字符串 (√)
三、常量,变量
1、常量:保持不变的量,如身份证号码等
2、变量:int num=90; char ch='w';
3、全局变量和局部变量
全局变量:代码块即{}外部定义
局部变量:代码块之内定义
判断:局部变量都在main()之内(X)
全局变量和局部变量同名的时候,局部变量优先于全局变量
#include<stdio.h>
int a = 100; //全局变量
int main()
{
int a = 10; // 局部变量
printf("%d", a);
return 0;
}
运行结果为10
4、变量生命周期及作用域
局部变量的作用域:局部变量所在的局部范围
全局变量的作用域:整个程序
局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束。
5、常量
分为直接常量(字面量)和字符常量
直接常量:直接拿来使用,不需要说明的量
1. 整形常量:13 、7
2. 实型常量:3.34
3.字符常量:'q' 'M'
4.字符串常量: " I Love China"
const修饰的常变量
#include<stdio.h>
int main()
{
int a = 10;
//const int a = 10;
a = 20;
printf("%d", a);
return 0;
}
屏幕打印20 a被const修饰为常量,a=20 报错
#define定义的标识符常量
#define LINE 20
#include<stdio.h>
int main()
{
//LINE = 30; LINE 是被定义的符号常量,不可以更改
printf("%d", LINE);
return 0;
}
枚举常量
#include<stdio.h>
enum Snake // 枚举类型
{
LENGTH,
SPEED,
GRADE,
};
int main()
{
enum Snake s =LENGTH;
printf("%d ", LENGTH);
printf("%d ",SPEED);
return 0;
}
结果:打印0 1
四、转义字符
strlen() // 求字符串长度函数,'\0'之前的长度
#include<string.h> // strlen() 引得头文件
#include<stdio.h>
int main()
{
char arr[] = "abc";
char brr[] = { 'a','b','c' };
// 改为char brr[]={'a','b','c','\0'} ; 结果为3
printf("%d\n",strlen(arr));
printf("%d",strlen(brr));
printf("%d", sizeof(arr) / sizeof(arr[0]));
return 0;
}
结果: 3 随机值 4
"abc" 的实际储存 :'a', 'b' , 'c', '\0' \0'为字符串的结束标志
brr的实际储存 :{'a','b','c',......之后是随机的一串,}在随机中遇到了'\0' ,停止
sizeof()注重实际内存,长度包括'\0'
五、运算符
算数运算符: + - / % ++ --
除法运算符 / :
2/1=2 2/1.0=2.000000 8/3=2 9.0/2=4.500000
取余运算符% :两个整数 10%3=1
正负号取决于被模数的符号 (-10)%3=-1 10%(-3)=1
%% 即为一个%
自增自减运算符
++a --a 先加减,后取值
a++ a-- 先运算,后取值
#include<stdio.h>
int main()
{
int a = 1;
printf("%d", a++);
return 0;
}
结果为1 先取a的值,后运算 printf 打印1,执行完了a=2
#include<stdio.h>
int main()
{
int a = 1;
int b = a++;
printf("%d", b);
return 0;
}
结果为1 b=a,a=a++ 此时b=1
#include<stdio.h>
int main()
{
int a = 1;
a++;
printf("%d", a);
return 0;
}
结果为2 a++执行之后 a=2
#include<stdio.h>
int main()
{
int a = 1;
int b = ++a;
printf("%d", a);
return 0;
}
结果 2 b=++a a++ ,b=a
赋值运算符
= += -= *= /=
int a=8; a-=5
即为a=a-5;a=3
关系运算符 > >= < <= == !=
关系运算符的结果为 0 1 0表示假,非0表示真
逻辑运算符 && || !
与运算&& : 两个都为真即为真
判断式1为假,则式2不实行 结果为0
或运算 || : 只要有一个为真则为真
判断式1真,式2不执行,结果为1
非运算 ! : (!真 )为假 ,(!假 ) 为真
三目运算符 (表达式1)?(表达式2):(表达式3)
表达式1为真,执行表达式2,反之,执行表达式3
#include<stdio.h>
int main()
{
int a = 8, b = 4;
int max = (a < b) ? b : a;
printf("%d", max);
return 0;
}
功能:找到两个数字中的最大值
位操作符 ^ & |
按位与 & : 同时为1才为1
按位或 | : 有一个1则为1
按位异或 ^ : 两个相同为0 两个不同为1
反码: 原码最高位不变,其他位按位取反
补码:反码+1
正数三者相等 计算机储存的是补码
60 & 13
60补码 :00000000 00000000 00000000 00111100
13 补码: 00000000 00000000 00000000 00001101
60&13 : 00000000 00000000 00000000 00001100 12
60|13
60补码: 00000000 00000000 00000000 00111100
13补码: 00000000 00000000 00000000 00001101
60|13 00000000 00000000 00000000 00111101 61
60^13 0000 0000 0000 0000 0000 0000 0011 0001 49
移位操作符 << >>
左移:左边抛弃,右边补0
右移:右边抛弃,左边补符号位 --------算数右移
右边抛弃,左边补0 --------逻辑右移
-2 <<1
-2的原码:10000000 00000000 00000000 00000010
-2补码:11111111 11111111 11111111 11111110
-2<<1 补码:11111111 11111111 11111111 11111100
-2<<1原码:10000000 00000000 00000000 00000100 -4
-1>>1
-1补码:11111111 11111111 11111111 11111111
-1>>1补码:11111111 11111111 11111111 11111111 ----算数右移
-1>>1原码:1000 0000 0000 0000 0000 0000 0000 0001 -1
按位取反 ~ 取地址 & 解引用 *
按位取反的值 -(a+1)
-2 原码 : 10000000 00000000 00000000 00000010
补码: 11111111 11111111 11111111 11111110
~(-2) :00000000 00000000 00000000 00000001 1