C语言学习笔记
1.初识C语言
常见类型长度
单位:字节=比特
全局变量和局部变量
全局变量:定义在花括号外的变量
局部变量:定义在花括号内的变量
局部变量和全局变量的名字重合时,局部变量优先
C语言规定变量要 定义在当前代码块的最前面
*计算两数之和:
#include <stdio.h>
int main()
{
int num1=0;
int num2=0;
int sum=0;
scanf("%d%d",&num1,&num2);//注意scanf要加双引号
sum=num1+num2;
printf("sum=%d\n",sum);
return 0;
}
代码域和生命周期
代码域:限定变量的可用性的代码范围
生命周期:变量的创建到销毁之间的一个时间段
不安全的函数
如scanf()等,会提示改用scanf_s() 取消提示只需要在源文件第一行最前面添加
#define _CRT_SECUR_NO_WARNINGS
常量
1.字面常量 如3;3.14
2.const 修饰的常变量 const int num=1; 之后无法再修改变量num的值
3.#define 定义的标识符常量 在花括号外面,代码块开头
#define MXA 10 //没有等号,没有分号
4.枚举常量
一 一列举
//写在main函数外面
enum Sex //enum是枚举的意思
{
MALE, //0 //注意是逗号
FEMALE,//1
SECRET //2 //注意没有符号
}; //;必不可少
//在main()函数里引用时的格式:
enum Sex s=xxx;
字符串
由双引号闭合的一串字符
注意:字符串结束的标志是一个 \0 的转义字符,在计算长度时是结束标志,不计入字符串内容,即不算长度
数组
char arr1[]="abc"; //数组 末尾有结束标志 \0
char arr2[]={'a','b','c'}; // 没有结束标志
char arr3[]={'a','b','c',0}; //添加结束标志0 或 '\0'
print("%s\n",arr1);
print("%s\n",arr2);
print("%s\n",arr3);
转义字符
\n:换行符(ASCII码值为10)
\r:回车符(ASCII码值为13)
\t:制表符(ASCII码值为9)
\b:退格符(ASCII码值为8)
\f:换页符(ASCII码值为12)
':单引号
":双引号
\ddd 表示1-3个8进制数字 如\32 \132
\xdd 表示2个十六进制数字 如\x30
需要注意的是,使用转义字符时应该注意以下几点:
[1]转义字符必须放在引号内部。
[2]转义字符只能用于字符串和字符常量中,不能用于普通的字符变量。
[3]有些编译器可能不支持某些转义字符或支持的方式不同,因此在编写跨平台的代码时应该避免使用不确定的转义字符。
转义字符算一个长度,即如 \t 只有一个字符长度
代码注释
/* */ 缺陷:不能嵌套
选择语句
#include <stdio.h>
int main()
{
int num=0;
scanf("%d",&num);
if(num==0) //注意此处没有冒号,且为双等号
printf("OK!\n");
else //注意此处没有冒号
printf("No!\n");
return 0;
}
循环语句
-
while语句
#include <stdio.h> int main() { int num=0; while(num<10) { printf("NO!"); num++; printf("num=%d\n",num); } //注意while循环要添加大括号,不然会造成无限循环 printf("OK!"); return 0; }
-
for语句(之后补充)
-
do-while语句(之后补充)
函数
函数的定义要写在主函数前面
定义函数:
#include <stdio.h>
int Add(int x, int y)
{
int z=x+y;
return z;
}
int main()
{
int sum=0;
sum=Add(5,6);
printf("%d",sum);
return 0;
}
数组
定义:一组相同类型元素的集合
注意:定义数组长度时,只能用常量,并不能使用变量。
#include <stdio.h>
int main()
{
int arr1[10]={1,2,3,4,5,6,7,8,9,10}; //定义一个存放十个数的数组,注意用大括号
printf("%d",arr1[0]); //数组的下标从0开始,此处为0-9
}
#include <stdio.h>
int main()
{
int i=0;
int arr1[10]={1,2,3,4,5,6,7,8,9,10}; //定义一个存放十个数的数组,注意用大括号
while(i<10)
{
printf("%d\n",arr1[i]);//数组的下标从0开始,此处为0-9
i++;
}
printf("over!");
}
操作符
算术操作符
移位操作符
移动的是二进制位
<< 左移1位
右移同理
int a=1;
a:00000000000000000000000000000001=1(4个字节,32比特)
b=<<a;
b=00000000000000000000000000000010=2
位操作符
&与
或
^异或
- !非
- 二进制按位取反
赋值操作符
单目操作符
(类型):强制类型转化
eg: (int)3.14
关系操作符
条件操作符
exp1 ? exp2 : exp3
满足exp1条件则执行exp2,不满足则执行exp3
原码、反码、补码
负数在内存中存储的时候,存储的是其二进制的补码,打印出来是原码
最高位是符号位,1是负,0是正
原码得反码
原码符号位不变,其他位按位取反,得到反码
反码得补码
反码+1
补码求原码:
补码-1得到反码
反码符号位不变,其他位按位取反得到原码
++
a++:先把a原来的值拿来使用,再a=a+1;
eg: a=10;
b=a++; //则b=10,a=11;
++a:先让a=a+1,再赋值
eg: a=10;
b=++a; //则b=11,a=11;
常见关键字(static)
auto:
auto int a=10;
位于局部变量前,通常省略
int:
int定义的变量是有符号的
unsigned int a= 1;无符号,恒为正;
struct:
结构体关键字
typedef
类型重命名
eg: typedef unsigned int u_int;
u_int num=10;
static
修饰局部变量,局部变量的生命周期变长
#include <stdio.h>
void test()
{
static int a=1; //a为静态的局部变量,即多次执行test()时,a的改变是累计的,每一次执行完test()后a不会被销毁
a++; //没有static时,每次执行test()时,a的值从1开始
printf("a=%d\n",a);
}
int main()
{
int i = 0;
while(i<5)
{
test();
i++;
}
return 0;
}
/*结果:
a=2
a=3
a=4
a=5
a=6
*/
修饰全局变量,改变了全局变量的作用域,让静态的全局变量只能在自己所在的源文件里使用。
//1.c
int g=2023;
//2.c
extern int g; //在2.c中引用1.c的全局变量g
//1.c改为
static int g=2023; //则在2.c中无法再引用变量g
修饰函数,改变了函数的链接属性,不再具有外部链接属性
#define定义常量和宏
定义标识符常量
#define MAX 100;
定义定义宏—带参数(可以不大写)
#define MAX(X,Y) (X>Y?X:Y)
指针
一个内存单元的最小空间是1字节byte
#include <stdio.h>
int main()
{
int a=10; //四个字节
&a; //取地址
printf("%p\n",&a); //注意是%p,且后面是&a
return 0;
}
//得到一个十六进制地址
int* p
#include <stdio.h>
int main()
{
int a=10;
int* p=&a; //p是指针变量,用来存放地址;定义指针变量用int*,char*等,具体类型由内存中存储的数据的类型决定
printf("%p\n",p);
return 0;
}
*p解引用
#include <stdio.h>
int main()
{
int a=10;
int* p=&a;
*p=20; //*是解引用操作符,*p表示找到所指向的内容a,此操作即修改a的值为20
printf("%p\n",p);
return 0;
}
指针变量的大小
32位平台:4个字节(32bit)
64位平台:8个字节(64bit)
标签:10,include,定义,int,笔记,C语言,学习,printf,main From: https://www.cnblogs.com/arongsec/p/17528867.html