鹏哥C语言入门——初识C语言(1)
标签: 鹏哥C语言入门——初识C语言(1) 博客 51CTO博客
2023-06-14 18:24:23 157浏览
1、第一个C语言程序
Tips:Microsoft Visual Studio:Ctrl+Fn+F5运行、Fn+F10调试,再按F10下一步;
主函数——程序的入口,main函数有且仅有一个;
int main() //int 整形,main前面的int表示函数调用返回一个整形值
{
printf("Hello World!\n"); //这里完成任务
return 0; //返回0
}
库函数——C语言提供给我们的函数;
#include<stdio.h> //包含一个叫stdio.h的文件
2、数据类型
char |
字符数据类型 |
short |
短整型 |
int |
整形 |
long |
长整型 |
long long |
更长的整形 |
float |
单精度浮点数 |
double |
双精度浮点数 |
%c——打印字符格式的数据 |
%d——打印整型的数据 |
%f——打印浮点型数字(打小数) |
%p——以地址的形式打印 |
%x——打印16进制数字 |
每种类型所创建空间的大小:
printf(“%d\n”,sizeof(char)); //1 (字节)
printf(“%d\n”,sizeof(short)); //2
printf(“%d\n”,sizeof(int)); //4
printf(“%d\n”,sizeof(long)); //4/8(C语言标准规定 sizeof(long)>=sizeof(int))
printf(“%d\n”,sizeof(long long)); //8
printf(“%d\n”,sizeof(float)); //4
printf(“%d\n”,sizeof(double)); //8
同一类型的有符号、无符号数的字节大小是一样的;
bite |
比特位1、0, 计算机中最小的单位 |
byte |
字节 1byte=8bit |
kb |
2^{10}byte=1024byte |
gb |
2^{20}byte |
tb |
2^{30}byte |
pb |
2^{40}byte |
3、常量、变量
生活中有些值是不变的(性别),有些值是可变的(年龄);不变的值用常量的概念来表示,变的值在C语言中用变量表示。
3.1 变量
3.1.1 定义变量的方法
short age = 20; //向内存申请2个字节=16bit位,用来存放20
float weight = 95.6f; //向内存申请4个字节,存放小数
3.1.2变量分类
局部变量——定义在代码块({})内部的变量;
全局变量——定义在代码块({})之外的变量;

当局部变量和全局变量的名字相同时,局部变量优先;
3.1.3变量的使用
C语言语法规定,变量要定义在当前代码块的最前面(cpp无此规定);


3.1.4 变量的作用域和生命周期
作用域(scope),程序设计概念,通常来说,一段程序代码中所用到的名字并不总是有效/可用的,限定这个名字的可用性的代码范围就是这个名字的作用域。
①局部变量的作用域是变量所在的局部范围;
②全局变量的作用域是整个工程;
生命周期,变量的生命周期指变量的创建到变量的销毁之间的一个时间段。
①局部变量的生命周期是:进入作用域开始,出作用域生命周期结束;
②全局变量的生命周期是:整个程序的生命周期;
回顾
#define _CRT_SECURE_NO_WARNINGS 1 //忽略掉scanf具有不安全性的警告
int main()
{
int num1=0;
int num2=0;
int sum=0;
scanf("%d%d",&num1,&num2); //strcpy、strlen、strcat等都是不安全的
sum = mum1+num2;
printf("sum=%d\n",sum);
return 0;
}
Tips: scanf是C语言提供的,scanf_s不是标准C语言提供的,而是VS编译器提供的;scanf_s在别的编译器中不能被识别,尽量不要使用scanf_s,失去了代码的跨平台性和可移植性;
#define _CRT_SECURE_NO_WARNINGS 1 加在源文件的第一行;

用记事本方式打开,写入 #define _CRT_SECURE_NO_WARNINGS 1然后保存。
3.2常量
C语言中常量和变量的定义形式有所差异。
C语言中的常量分为以下几种:
- 字面常量
- const修饰的常变量
- #define定义的标识符常量
- 枚举常量
3.2.1const修饰的常变量
int main()
{
int num = 4; //num为变量
3; //3是字母常量
//const——常属性,num1为const修饰的常变量,num1的值不可更改
const int num1 = 8; //num1的本质还是一个变量,只是具有常属性;类比美籍华人
return 0;
}
例如,
int n = 10;
int arr[n]={0};
//报错,error C2057:应输入常量表达式; error:不能分配常量大小为0的数组
n前加const修饰,修改后依然报错;
因为n是变量,但是又有常属性,所以说n是常变量;
const int n = 10;
int arr[n]={0};
//报错,error C2057:应输入常量表达式; error:不能分配常量大小为0的数组
3.2.2 #define定义的标识符常量
#include<stdio.h>
#define MAX 10
int main()
{
int arr[MAX] = {0};
return 0;
}
3.2.3 枚举常量
枚举:一一列举
枚举关键字:enum
例如 性别:男、女; 三原色:红、黄、蓝
enum Sex //性别枚举
{
MALE, //男
FEMALE, //女
SECRET //保密
};
//MALE、FEMALE、SECRET为枚举常量
int main()
{
enum Sex s = FEMALE;
s = SECRET; //s可更改
printf("%d\n",MALE); //0
printf("%d\n",FEMALE); //1
printf("%d\n",SECRET); //2
return 0;
}
输出结果为 0 1 2
枚举常量不能修改,如MALE = 2; 但是s可以更改;
4、字符串+转义字符+注释
4.1字符串
“hello bit.\n” 、 “” //空字符串
1、这种由双引号引起来的一串字符称为字符串。
2、字符串的结束标志是一个\0的转义字符。在计算字符串长度的时候\0是结束标志,不算作字符串内容。
#include<stdio.h>
int main()
{
char arr1[] = "abc"; //数组
char arr2[] = {'a','b','c'};
printf("%s\n",arr1); //打印输出显示 abc
printf("%s\n",arr2); //打印输出显示 abc烫烫烫烫蕴bc
return 0;
}

Tips:调试——>窗口——>监视——>选择一个如监视1(1)——>
为什么会出现这种现象?
"abc"——'a' 'b' 'c' '\0' ——'\0'是字符串的结束标志;
第二种写法在打印c后没有字符串的结束标志,继续打印一些随机值;
区分'\0' 0 '0' EOF:
'\0':是一个转义字符,ASCll码值为0;
0:数字0;
'0':字符0,ASCll码值为48;
EOF:end of file ,文件结束标志,值为-1;
如何更改?
主动增加结束标志,打印完abc后结束;
char arr2[] = {'a','b','c',0};
ASCll表
十进制 |
字符 |
0 |
|
48 |
0 |
57 |
9 |
65 |
A |
90 |
Z |
97 |
a |
122 |
z |
#include<stdio.h>
int main()
{
char arr1[] = "abc";
char arr2[] = {'a','b','c'};
//strlen——计算字符串长度
printf("%d\n",strlen(arr1)); //打印输出显示 3
printf("%d\n",strlen(arr2)); //打印输出显示 15(随机值)
return 0;
}
为什么是这个结果?
arr1内容: a b c \0;strlen遇到\0结束,计算字符串长度并没有把\0算在内。
arr2内容:a b c XXXXXXX \0 XXXX;strlen一个个往后数直到遇到\0,因此输出的值是一个随机数。
4.2转义字符
转义字符,转变原来的意思;
#include<stdio.h>
int main()
{
printf("abcn"); //打印输出显示 abcn
printf("abc\n"); //打印输出显示 abc
return 0;
}
转义字符 |
释义 |
\? |
在书写连续多个问好时使用,防止他们被解析成三字母词 |
\' |
用于表示字符常量' |
\" |
用于表示一个字符串内部的双引号 |
\\ |
用于表示一个反斜杠,防止它被解释为一个转义序列数 |
\a |
警告字符,蜂鸣 |
\b |
退格符 |
\f |
进格符 |
\n |
换行 |
\r |
回车 |
\t |
水平制表符 |
\v |
垂直制表符 |
\ddd |
ddd表示1~3个八进制的数字,如\130 |
\xdd |
dd表示2个十六进制数字。如:\x30 |
4.2.1例子 \?
#include<stdio.h>
int main()
{
printf("(are you ok\?\?)\n"); //打印输出显示 (are you ok??)
return 0;
}
4.2.2例子 \\ \' \"
#include<stdio.h>
int main()
{
printf("%c\n",'\''); //打印输出显示 '
printf("%s\n","\"abc\""); //打印输出显示 "abc"
printf("c:\\test\\32\\test.c"); //打印输出显示 c:\test\32\test.c
return 0;
}
思考例题
#include<stdio.h>
#include<string.h>
int main()
{
printf("%d\n",strlen("c:\test\32\test.c")); //打印输出显示 13
return 0;
}
原因:\t 和 \32看作一个转义字符;
\32——32是2个8进制数字;
32八进制数字——>转为十进制数字26——>26作为ASCll码值对应的字符。
4.2.3例子 \ddd \xdd
printf("%c\n",'\132'); //打印输出显示 Z
\132——>132是八进制数字——>转为十进制数字90——>90作为ASCll码值对应的字符为Z。
printf("%c\n",'\x61'); //打印输出显示 a
\x61——>61是十六进制数字——>转为十进制数字97——>97作为ASCll码值对应的字符为a。
4.3注释
1、不需要的代码可以直接删除或注释;
2、有些代码难懂,可以加注释文字;
3、注释有两种风格:
C语言风格的注释 /* xxxxxxx */,缺陷是不能嵌套注释;
C++风格的注释 // xxxxxxxxx,可以注释一行或多行;(快捷键ctrl+k+c注释,crtl+k+u取消注释)
5、选择语句
int main()
{
int input = 0;
printf("你有offer吗?(0/1)>: ");
scanf("%d",&input);
if(input == 1)
printf("是的\n");
else
printf("没有\n");
return 0;
}
6、循环语句
int main()
{
int line = 0;
while(line<20000)
{
printf("敲一行代码:%d\n",line);
line++;
}
if(line>=20000)
{
printf("收到offer\n");
}
return 0;
}
7、函数
#include <stdio.h>
int Add(int x,int y)
{
int z = x+y;
return z;
}
int main()
{
int a=10;
int b=20;
int sum=0;
sum=Add(a,b);
printf("sum=%d\n",sum);
return 0;
}
函数包括自定义函数、库函数。
8、数组
要存储1-10的数字,如何存储?
C语言中给出了数组的定义:一组相同类型元素的集合。
8.1数组定义
#include <stdio.h>
int main()
{
int arr[10] = {1,2,3,4,5,6,7,8,9,10}; //定义一个存放10个整数数字的数组
printf("%d\n",arr[4]); //打印 5
int i = 0;
while(i<10)
{
printf("%d ",arr[i]); //打印数组所有内容 1 2 3 4 5 6 7 8 9 10
i++;
}
return 0;
}
9、操作符
算术操作符 |
+ - * / % |
移位操作符 |
>> << |
位操作符 |
& ^ | |
赋值操作符 |
= += -= *= /= &= ^= |= <<= >>= |
单目操作符 |
见下 |
单目操作符
! |
逻辑反操作 |
- |
负值 |
+ |
正值 |
& |
取地址 |
sizeof |
操作数的类型长度(以字节为单位) |
~ |
对一个数的二进制按位取反 |
-- |
前置、后置-- |
++ |
前置、后置++ |
* |
间接访问操作符(解引用操作符) |
(类型) |
强制类型转换 |
关系操作符 |
> >= < <= !=(用于测试不等) ==(用于测试相等) |
逻辑操作符 |
&& 逻辑与 || 逻辑或 |
条件操作符 |
exp1 ? exp2 : exp3 (表达式1的结果为真,执行表达式2的结果) |
逗号表达式 |
exp1,exp2,exp3, ...expN |
下标引用、函数调用和结构成员 |
[] () . -> |
9.1移位操作符
//移(2进制)位操作符
// <<左移
// >>右移
int a = 1; //整型1占4个字节=32bit 00000000000000000000000000000001
int b = a<<1; //左移后为: 000000000000000000000000000000010,转化为十进制为2。
printf("a=%d\n",a); //打印 1 (a左移后保持不变,类似 b=a+1,a的值不变)
printf("b=%d\n",b); //打印 2
9.2位操作符
//移(2进制)位操作符
// & 按位与
// | 按位或
// ^ 按位异或
int a = 3; //011
int b = 5; //101
int c = a&b; //001, 即1
int d = a|b; //111, 即7
int e = a^b; //异或计算规律为相同为0,相异为1;
//110, 即6
9.3单目操作符
9.3.1逻辑反操作!
int main()
{
int a = 10;
//c语言中表示真假,0为假,非0为真
printf("%d\n",a); //打印10
printf("%d\n",!a); //打印0
int a = 0;
printf("%d\n",a); //打印0
printf("%d\n",!a); //打印1
return 0;
}
9.3.2操作数类型长度sizeof
int arr[10]={0};
int sz = 0;
//计算数组大小,单位是字节
printf("%d\n",sizeof(arr)); //打印40
//计算数组的元素个数
//个数=数组总大小/每个元素的大小
sz = sizeof(arr)/sizeof(arr[0]);
printf("sz = %d\n",sz); //打印10
9.3.3按位取反~
#include<stdio.h>
int main()
{
int a=0; //00000000000000000000000000000000
int b=~a; //11111111111111111111111111111111
printf("%d\n",b); //-1 使用、打印的是原码
return 0;
}
原码、反码、补码
负数在内存中存储的时候,存储的是二进制的补码;
11111111111111111111111111111111是补码,需要转换成原码打印使用;
10000000000000000000000000000001是原码,值-1。
9.3.4前置、后置-- ++
#include<stdio.h>
int main()
{
int a = 10;
int b =a++; //后置++,先使用,再++
printf("a=%d,b=%d\n",a,b); //a=11,b=10
int b =++a; //前置++,先++,再使用
printf("a=%d,b=%d\n",a,b); //a=12,b=11
return 0;
}
9.3.5强制类型转换(类型)
#include<stdio.h>
int main()
{
int a = (int)3.14; //double转换为int类型
return 0;
}
9.4条件操作符
#include<stdio.h>
int main()
{
int a = 10;
int b = 20;
int max = 0;
//表达式a>b为真,a执行,赋值给max;否则b执行,赋值给max
max = (a>b? a : b);
return 0;
}
好博客就要一起分享哦!分享海报
此处可发布评论
评论(0)展开评论
展开评论



