目录
数组结束标志是"\0",如下程序没有给出具体\0位置,所以输出是随机值。
1.工欲善其事必先利其器
编译C语言需要什么工具?
·VS 2022(博客讲解均基于VS2019进行)下载 Visual Studio Tools - 免费安装 Windows、Mac、Linux
·Qt Creator (可以跨平台安装和运行,开源) Index of /archive/qt (下面为其他博主分享的Qt使用教程Qt使用教程_不当初-CSDN博客_qt使用)
2.写出第一个代码
创建新项目>>
设置完路径和名称后,你会发现来到了这里
右击源文件,进行如下操作
注意: ;隔开就是一条语句
//写C语言代码,首先要写出主函数 两个//代表注释,在写代码的时候经常使用注释可以帮助我们很好的理解代码
#include <stdio.h> //库函数的使用,得包含对应的头文件
int main() //主函数,是程序的入口,主函数有且仅有一个
{
printf("Hello,World"); //printf是C语言提供的打印库函数
return 0;
}
//这时候按Ctrl+F5,程序就会运行起来
3.数据类型
sizeof 是用来计算一个类型大小
%d - 打印整型 %s - 打印字符串 %c - 打印字符 %u 打印无符号整数
int main()
{
printf("%u\n", sizeof(char));//1个字节,代表char类型8个bit位
printf("%u\n", sizeof(short));//2个字节,代表short类型16个bit位
printf("%u\n", sizeof(int));//4个字节,代表in类型32个bit位
printf("%u\n", sizeof(long));//4个字节,代表long类型32个bit位
printf("%u\n", sizeof(long long));//8个字节,代表long long类型有64个bit位
printf("%u\n", sizeof(float));//4个字节,代表float类型有32个bit位
printf("%u\n", sizeof(double));//8个字节,代表double类型有64个bit位
return 0;
}
4.变量的分类
int b = 1000;//全局变量 - 定义在大括号的外部
int a = 1000;
int main()
{
int a = 100;//局部变量 - 定义在大括号的内部
//局部变量的名字和全局变量的名字冲突的情况下,局部优先
printf("a = %d\n", a);
return 0;
}
此时a的结果是100.
注意:
1. scanf函数,格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。
2.(#define _CRT_SECURE_NO_WARNINGS 1 是为了让scanf函数不报错,因为我们忽略了scanf函数的返回值)
写一个代码,完成2个整数的相加
#include <stdio.h>
#define _CRT_SECURE_NO_WARNINGS 1
int main()
{
int num1 = 0;//初始化一个变量,num1仅仅是我们自定义的一个变量名
int num2 = 0;//
int sum = 0;//存放加法的结果
//输入
scanf("%d %d", &num1, &num2);//&下节课会讲
//目前可以理解为num1,num2两个变量给输入函数用来存放.
//相加
sum = num1 + num2;
//输出
printf("%d\n", sum);
return 0;
}
//下面写成函数的写法
int Add(int x, int y)
{
int z = 0;
z = x + y;
return z;
}
int main()
{
int num1 = 0;
int num2 = 0;
int sum = 0;
scanf("%d %d", &num1, &num2);
//求和
//sum = num1 + num2;
sum = Add(num1, num2);
printf("%d\n", sum);
return 0;
5.函数的生命周期
通常来说,一段程序代码中所用到的名字并不总是有效/可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。
1.局部变量的作用域是变量所在的局部范围。
2.全局变量的作用域是整个工程变量的生命周期指的是变量的创建到变量的销毁之间的一个时间段
3.局部变量的生命周期是:进入作用域生命周期开始出作用域生命周期结束
4.全局变量的生命周期是:整个程序的生命周期。
#include <stdio.h> int main() { { int a = 100; printf("%d\n", a); } printf("%d\n", a);//此时程序报错,a已经在{}局部变量执行完毕销毁了 return 0; }
static修饰局部变量,延长生命周期
理解:
1.while是循环,阔号内部()是判断循环是否继续,非0则为真继续,0则为假跳出循环
2.test(),test是我们自己创建的函数,执行表示进到该函数内部去执行,再返回
#include <stdio.h>
void test()
{
static int a = 1;
//.static修饰全部变量(或者函数),改变了作用域,让静态的全局变量只能在自己的源文件内部使用
//外部文件用extern就无法调用了,会提示无法解析外部符号
a++;
printf("a=%d\n",a);
}
int main()
{
int i = 0;
while(i<5)
{
test();
i++;
}
return 0;
}
结果是23456(a没有销毁)
6.求字符串长度
#include <stdio.h>
strlen - 库函数
求字符串的长度
#include <string.h>
int main()
{
char arr1[] = "abc";
char arr2[] = { 'a', 'b', 'c', '\0'};
printf("%d\n", strlen(arr1));//3
printf("%d\n", strlen(arr2));//3
/*printf("%s\n", arr1);
printf("%s\n", arr2);*/
return 0;
}
注意:如果此时你去掉了arr2数组中的\0,结果就会不一样
数组结束标志是"\0",如下程序没有给出具体\0位置,所以输出是随机值。
strlen是获取字符串的有效长度的,结尾’\0’不计算在内。
strlen获取的规则非常简单:从前往后一次检测,直到遇到’\0’是就终止检测。
7.进制转换
1.10进制转二进制
十进制无限除2,结果的余数要么是1,要么0,最后除到1后,从除到的1顺序加
同理,二进制转10进制,例如00001010,最右边0代表2的0次方,1代表2的一次方,0代表2的2次方,1代表2的三次方,结果就是10 (初学者实在不会推荐进制转换 - 在线工具)
字符的‘130’,代表的是把130这个8进制数数字转换成10进制后得到的88,作为ascii码值代表的字符 ‘X’
8.操作符
int main()
{
int a = 0;//初始化
//
a = 20;//赋值
//a = a + 10;
a += 10;//复合赋值符
a -= 15;// 换个意思是a=a-15
printf("a=%d\n", a);//a的结果是15
return 0;
}
int main()
{
//printf("%d\n", 7 / 3);//2....1
//printf("%f\n", 7 / 3.0);
printf("%d\n", 7 % 3);//2...1
return 0;
}
运行的结果?
#include <stdio.h>
int main()
{
int a = 0;
printf("%d",~a);//逻辑反操作符
return 0;
}
//结果是-1
负数在计算机中是以补码表示的,因为在有模的计量系统中,减一个数等于加上它的补数,从而实现将减法运算转化为加法运算的目的。(类似时钟调节时间,可以加也可以减)
只要是整数,在内存中存储的都是其补码。
正数的补码、源码、反码一样
负数要算,源码取反(符号位也就是第一位不要取反)得到反码,然后反码 + 1得到补码。
跟数学中的且(&&),或(||)一样,a&&b中任意一个为0则结果为0,a||b中任意一个为非0则结果为真