1、main函数是程序的入口,有且只能有一个
2、printf:输出 sizeof:以字节形式给出其操作数的存储大小 scanf:输入控制符(scanf("%d", &i); //&i 表示变量 i 的地址,&是取地址符)
3、数据类型:int(整型)、short (短整型)、 long(长整型)、char(字符类型)、long long(更长的整型)、 float(单精度浮点数)、double(双精度浮点数)
4、 变量(局部变量、全局变量)
变量的命名:只能有字母(大小写)、数字和下划线(_)组成;不能以数字开头;长度不能超过63个字符;变量名中区分大小写;不能以关键字命名;不能重复命名
全局变量和局部变量同名的时候,先使用局部变量(局部优先)
局部变量的作用域是变量所在的局部范围;全局变量的作用域是整个工程
局部变量的生命周期是进入作用域生命周期开始,出作用域生命周期结束;全局变量的生命周期是整个程序的生命周期
5、常量
字面常量、const修饰的常变量、#define定义的标识符常量、枚举常量
#include <stdio.h>
// 枚举常量,默认从0开始,依次向下递增1
enum SEX
{
MAEE,
FEMALE,
SECRET
};
int main()
{
//字面常量
30;
3.13;
'w'; //字符
"sac"; //字符串
//const 修饰的常量 const修饰的pai本质就是变量,不能直接修改,有常亮的属性,所以叫常变量!!
const float pai = 3.14; //不能直接修改!!
//#define的标识符常量
#define MAX 100
//枚举常量
printf("%d\n",MAEE);
}
6、字符串
由双引号引起来的一串字符。字符串的结束标志是一个\0的转义字符,在计算字符串长度的时候\0是结束标志,不算字符串内容。
#include <stdio.h>
#include <string.h>
int main()
{
char arr1[] = "bit";
char arr2[] = {'b', 'i', 't'};
char arr3[] = {'b', 'i', 't', '\0'};
printf("%s\n", arr1);
printf("%s\n", arr2);
printf("%s\n", arr3);
strlen(arr1); // strlen 求字符串长度 头文件 string.h 输出3
strlen(arr2); // 不确定,除非一直识别到了\0 才停下计算
return 0;
}
//后台监视
'b','i','t','\0'
'b', 'i', 't'
'b', 'i', 't', '\0'
//输出
bit
bit烫烫烫烫bit ---> 相当于bit前后都存储了其他数据,这儿输出的时候 会将全部的bit识别出来
bit ---> \0 结束标志
7、转义字符
转义字符 | 释义 |
\? | 在书写连续多个问号时使用,防止被解析成三字字母 |
\' | 字符常量 ' |
\" | 表示一个字符串内部的双引号 |
\\ | 表示一个反斜杠,防止被解释为一个转义序列符 |
\a | 警告字符 |
\b | 退格符 |
\f | 换页。将当前位置移到下一页的开头。 |
\n | 换行 |
\r | 回车换行。将当前位置移到下一行的开头。 |
\t | 水平制表符。将当前位置移到下一个tab位置 |
\v | 垂直制表符 |
\ddd | ddd表示1~3个八进制的数字 |
\xdd | dd表示2个十六进制数字 |
8、选择语句
#include <stdio.h>
int main()
{
int coding = 0;
scanf("%d',&coding);
if(coding == 1)
{
printf("hello");
}else{
printf("no");
}
return 0;
}
9、循环语句
1、while语句循环
/***
while语句的语义是:计算表达式的值,当值为真(非0)时, 执行循环体语句。
1、程序先判断A是否为真,如果为真则执行循环体B
2、当执行完循环体后再回到第1步
3、当表达式A为假时结束循环
***/
#include <stdio.h>
int main()
{
int line = 0;
while(line <= 20)
{
line++;
}
}
2、for循环
/***
for(表达式1;表达式2;表达式3) 语句;
先执行"表达式1",并且程序只会执行1次"表达式1"。注:"表达式1"仅在第一次循环时执行,以后都不会再执行,可以认为这是一个初始化语句!
接着程序判断条件"表达式2"的结果是否为"真",为"真"时,程序就执行语句块的内容。注:"表达式2" 一般是一个关系表达式,决定了是否还要继续下次循环,称为"循环条件"。
语句块执行完的话,接下来会执行"表达式3"! 注:"表达式3" 很多情况下是一个带有自增或自减操作的表达式,以使循环条件逐渐变得"不成立"。
然后重复 第二步骤 和 第三步骤,直到 "表达式2" 判断条件不成立就退出循环
***/
int main()
{
for(int a = 0;a < 20;a = a + 1){
printf('%d\n',a);
}
return 0;
}
3、do……while循环
/***
while 和 for 这两种循环都是先判断,条件如果满⾜就进⼊循环,执⾏循环语句,如果不满⾜就跳
出循环;
⽽ do while 循环则是先直接进⼊循环体,执⾏循环语句,然后再执⾏ while 后的判断表达式,表
达式为真,就会进⾏下⼀次,表达式为假,则不再继续循环。
所以在 do while 语句中循环体是⾄少执⾏⼀次的,这是 do while 循环⽐较特殊的地⽅
***/
int main()
{
int a = 10;
do
{
printf("%d\n",a);
a = a + 1;
}while(a < 20);
return 0;
}
10、函数
#include <stdio.h>
int main()
{
int num1 = 0;
int num2 = 0;
int sum = 0;
scanf("%d %d ",&num1,&num2);
sum = num1 + num2;
printf("sum = %d\n",sum);
return 0;
}
上述代码可以写成函数模式:简化代码,重复使用
int ADD(int x , int y)
{
int z = x + y;
return z;
}
// 也可以写成:
//int ADD(int x , int y){
// return (x + y );
// }
int main()
{
int num1 = 0;
int num2 = 0;
int sum = 0;
scanf("%d %d ",&num1,&num2);
sum = ADD(num1,num2);
printf("sum = %d\n",sum);
return 0;
}
11、数组 :一组相同类型元素的集合
int arrr[10] = {1,2,3,4,5,6,7,8,9,10} //定义一个整型数组,最多放10个元素
int arr[] = {1,2,3,4} //如果不写有多少个,他就自动识别后面元素有多少个
/***
数组的下标:数组的每个元素都有一个下标,下标是从0开始的,可以通过下标来访问元素
***/
#include <stdio.h>
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
for(int i = 0;i < 10;i++){
printf("%d\n",arr[i]);
}
printf("\n");
return 0;
}
12、操作符
1、算数操作符(+ - * / %)
#include<stdio.h>
int main()
{
int a = 2, b = 5, sum = 0;
//a与b相加
sum = a + b;
//a与b相减
sum = a - b;
//a与b相乘
sum = a * b;
//a与b 相除 若'/'左边的数大于右边,则得出的结果是取商的那部分;若'/'左边的数小于右边,则得到的结果为0 ;两边都是整型,即使定义返回数类型为浮点数,计算输出也是一个整数
sum = b / a // 输出为2 5除以2 商2余1
sum = a / b //输出为0
//如果有一个操作数为浮点数,那结果输出是浮点数
double sum = 5 / 2.0;
printf("%lf\n",sum); //输出为2.5
sum = 2 / 5.0 ; //输出为0.4
// %取模操作符,取的是一个数除另外一个直至除不尽的余数,若取模对象刚好是自己的公约数,则结果为0。例如 5%1=0 5%2=3 5%3=2 5%4=1 5%5=0
//注意:取模的对象不能为0,且不能为浮点型,必须为整数!!!!
sum = b % a ; //输出为 1
return 0;
}
2、位移操作符(>> <<)
#include<stdio.h>
int main()
{
/***
左移操作符可以将一个二进制数向左移动指定的位数,移动后在右侧补0。操作后不会让数据变化,需要用赋值操作符才能保存下来。
***/
int a = 7;
//7的二进制序列补码为 00000000000000000000000000000111
//经过左移操作符移动一位得 00000000000000000000000000001110
//将二进制转化为十进制可得结果为 14
a << 1;
printf("%d\n", a); // 7
int b = a << 1;
printf("%d\n", b); //14
printf("%d\n", a<<1); //14
/***
右移操作符1、逻辑右移 左边用0填充,右边丢弃
2、算数右移 左边用原该值的符号位填充,右边丢弃
***/
int a = -7;
//-7的二进制序列原码为 10000000000000000000000000000111
//-7的二进制序列反码为 11111111111111111111111111111000
//-7的二进制序列补码为 11111111111111111111111111111001
//经过右移操作符移动一位得 11111111111111111111111111111100
//转化为原码可得 10000000000000000000000000000100
//将二进制转化为十进制可得结果为 -4
a >> 1;
printf("%d\n", a); // -7
int b = a >> 1;
printf("%d\n", b); //-4
printf("%d\n", a >> 1); //-4
return 0;
}
3、位操作符 ( & ^ | ~)
& 按位与 只要有0则为0,两个为1才为1
| 按位或 有1则为1
^ 按位异或 相同为0,相异为1
~ 按位取反 0取反1,1取反0
注意:他们的操作数必须是整数!!!!!!
#include<stdio.h>
int main()
{
int a = 5;
int b = -2;
printf("a & b = %d \n", a & b); //打印 1
printf("a | b = %d \n", a | b); //打印 5
printf("a ^ b = %d \n", a ^ b); //打印 4
printf("%d\n", ~a); //打印-6
return 0;
}
5 的补码:00000000 00000000 00000000 00000101 5的取反:11111111 11111111 11111111 11111010
-2 的原码:10000000 00000000 00000000 00000010
-2 的反码:11111111 11111111 11111111 11111101
-2 的补码:11111111 11111111 11111111 11111110
5 & -2 的补码:00000000 00000000 00000000 00000100 5 &- 2 的原码:00000000 00000000 00000000 00000100
5 | -2 的补码:11111111 11111111 11111111 11111111 5 | -2 的反码:11111111 11111111 11111111 11111110 5 | -2 的原码:10000000 00000000 00000000 00000001
5 ^ -2 的补码:11111111 11111111 11111111 11111011 5 ^ -2 的反码:11111111 11111111 11111111 11111010 5 ^ -2 的原码:10000000 00000000 00000000 00000101
5取反后(补码):11111111 11111111 11111111 11111010 反码:11111111 11111111 11111111 11111001 原码:10000000 00000000 00000000 0000011
4、单目操作符(!- + sizeof ~ -- ++ *)
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
#include<stdio.h>
int main()
{
int a = 1;
int b = 0;
if (a)
printf("111\n");
if (!a) //把真变假
printf("222\n");
if (b)
printf("333\n");
if (!b) //把假变真
printf("444\n");
printf(%d\n",-a); //输出 -1
//&与 * 经常搭配使用,&用于取出想要变量的地址
int c = 10;
int* p = &c; //c变量的地址
//*p是对p进行解引用操作,*p是通过p中存放的地址,找到p指向的对象
//*p其实是a
*p += 1;
printf("c = %d\n", c); // 输出11
return 0;
}
//前置++或 -- 都是先 +1或-1 再使用;后置 ++或 -- 都是使用,再+1或 -1。
#include<stdio.h>
int main()
{
int a = 5;
int b = 0;
b = ++a; //前置++,先+1再使用,所以b=a=6
printf("a = %d b = %d\n", a, b);
b = a++; //后置++,先使用再+1,所以a=7,b=6
printf("a = %d b = %d\n", a, b);
// --与++用法相同
return 0;
}
5、关系操作符(> >= < <= != ==)
!= 用于测试“不相等”
== 用于测试“相等”
6、逻辑操作符(&& || )
&& 逻辑与 操作符两端都为真才为真,当已经判断了一个条件为假,剩下的条件就不需要再继续判断了,整个式子的判断为假。
|| 逻辑或 操作符两端有一为真则为真,当已经判断了一个条件为真,剩下的条件就不需要再继续判断了,整个式子的判断为真。
7、条件操作符(exp1 ? exp2:exp3 )
条件操作符,当表达式一判断为真,则输出表达式二的结果;当表达式一判断为假,则输出表达式三的结果。
#include<stdio.h>
int main()
{
int a = 1;
int b = 2;
//可以用来判断两个数中的较大值
printf("%d", a > b ? a : b); // 2
return 0;
}
8、逗号表达式(exp1 ,exp2,exp3,....expN)
逗号表达式,就是用逗号隔开的多个表达式。
逗号表达式,从左向右依次执行。整个表达式的结果是最后一个表达式的结果。
#include<stdio.h>
int main()
{
int a = 1;
int b = 2;
int c = (a > b, a += b, b += 1);
//此时a等于多少? 3
//b等于多少? 3
//c等于多少? 3
//a>b判断为假会影响后面的计算吗? 逗号表达式中判断为真或为假,不影响表达式的进行;表达式中进行的运算会对值产生影响;且整个表达式的值为最后一个表达式的值。
printf("%d \n", c);
return 0;
}
13、常见关键字
typeof 类型定义,类型重命名
continue是继续的意思,用于循环语句。
default用于switch语句中。
do用于do while循环语句中。
else用if选择语句中。
enum用于枚举关键字。
extern用于声明外部符号
for用于for语句的循环。
goto用于分支循环语句。
if用于分支循环语句。
register用于寄存器。
return返回值,函数中使用。
signed有符号的(一个数的正负之分)。
unsigned无符号的。
sizeof用来计算类型大小。
static静态的数据类型存储。
struct自定义数据类型的关键字----结构体。
typedef类型重命名。
union联合体(共用体)。
void无/空的意思。
volatile后面c++中Linux里介绍。
while用于while循环。