什么是C语言
C语言是一门面向过程的计算机编程语言,与C++、Java等面向对象的编程语言有所不同。
第一个C语言程序
#include<stdio.h>
int main()
{
printf("Hello world!\n");
return 0;
}
数据类型
整型不带小数点
char //字符数据类型
short //短整型
int //整型
long //长整型
long long //更长的整型
------------------------------
浮点型带小数点
float //单精度浮点型
double //双精度浮点型
void main()
{
char ch;
int i;
float f;
}
求各个数据类型的字节大小? 可以利用sizeof操作符求数据类型的大小
#include<stdio.h>
#include<stdbool.h>
void main()
{
printf("%d\n", sizeof(char));
printf("%d\n", sizeof(short));
printf("%d\n", sizeof(int));
printf("%d\n", sizeof(float));
printf("%d\n", sizeof(double));
printf("%d\n", sizeof(long));
printf("%d\n", sizeof(long long));
printf("%d\n", sizeof(bool));
}
运行结果:
1
2
4
4
8
4
8
1
容量单位:bit,byte,kb,mb,gb,tb,pb
1byte = 8bit
1k = 1024k
1g = 1024m
1t = 1024g
1p = 1024t
数据在计算机中以二进制形式存储 二进制:0 1 八进制:0 1 2 3 4 5 6 7 十进制:0 1 2 3 4 5 6 7 8 9 十六进制:0 1 2 3 4 5 6 7 8 9 A B C D E F
void main()
{
char ch = 'A';
short s = 10;
int i = 100;
double d = 12.34;
}
开辟一块空间为其命名,并且初始化
变量
变量的分类:局部变量、全局变量
int x = 0;
void main()
{
char ch = '0';
int a = 0;
}
int number = 20;
int main()
{
int number = 10;
printf("%d", number);
return 0;
}
运行结果:
10
全局变量和局部变量可以同名(在我看来,能不同名就不同名),优先使用局部变量,局部变量的作用域是变量所在的局部范围,生命周期是进入作用域开始,离开作用域结束;全局变量的作用域是整个工程,生命周期也是整个工程。
scanf函数和printf函数的使用
void main()
{
int a, b;
printf("input a and b:>");
scanf("%d %d", &a, &b);
int res = a + b;
printf("res = %d\n", res);
}
运行结果:
input a and b:>10 20
res = 30
请按任意键继续. . .
注意点
scanf("%d %d\n", &a, &b); //错误,不能有\n
input a and b:>10,20 //错误,输入10和20中间用空格分隔
error C4996: 'scanf': This function or variable may be unsafe.
//需要在最前面加一句 #define _CRT_SECURE_NO_WARNINGS
void main()
{
char ch = 'A';
short s = 10;
int i = 100;
double d = 12.34;
char *str = "Hello";
size_t size = 100;
printf("ch = %c\n", ch);
printf("s = %d\n", s);
printf("d = %lf\n", d);
printf("str = %s\n", str);
printf("size = %u\n", size);
}
运行结果:
ch = A
s = 10
d = 12.340000
str = Hello
size = 100
请按任意键继续. . .
变量的作用域和生命周期
作用域
作用域,程序设计概念,通常来说,一段程序代码所用到的名字并不是总是有效/可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域
1.局部变量的作用域时变量所在的局部范围 2.全局变量的作用域是整个工程
生命周期
变量的生命周期指的是变量的创建到变量的销毁之间的一段时间段
1.局部变量的生命周期是:进入作用域生命周期开始,出作用域生命周期结束 2.全局变量的生命周期是:整个程序的生命周期
int x = 1;
void fun()
{
printf("x = %d\n", x);
}
void main()
{
int a = 10;
printf("x = %d\n", x);
printf("a = %d\n", a);
{
int b = 20;
printf("b = %d\n", b);
printf("x = %d\n", x);
}
printf("a = %d\n", a);
printf("x = %d\n", x);
}
运行结果:
x = 1
a = 10
b = 20
x = 1
a = 10
x = 1
请按任意键继续. .
常量
常量的分类:字面常量、const修饰的常变量、#define定义的标识符常量、枚举常量
#define PI 3.14
enum season
{
spring,
summer,
autumn,
winter
};
int main()
{
const int num1 = 10;
return 0;
}
字符串、转义字符、注释
字符串
'A'; //字符
”A“; //字符串 隐含一个\0
这种由双引号引起来的一串字符称为字符串字面值,或者简称字符串。 注:字符串的结束标志是一个\0的转义字符。在计算字符串长度的时候\0是结束标志,不算字符串内容。
void main()
{
printf("%d\n", strlen("abcxyz"));
return 0;
}
运行结果:
6
void main()
{
printf("%d\n", strlen("abc\0xyz"));
return 0;
}
运行结果:
3
void main()
{
char ar[] = "bit";
char br[] = {'b','i','t','\0'};
char cr[] = {'b','i','t'};
char *str = "Hello Bit";
printf("%d\n", strlen(ar));
printf("%d\n", strlen(br));
printf("%d\n", strlen(cr));
}
运行结果:
3
3
15 -> 随机值
/0 是字符串的结束标志
转义字符
void main()
{
char *str = "C:\\Program Files (x86)\\Google";
char *str1 = "Hello \"world\"";
char *str2 = "Hello \'world\'";
printf("str = %s \n", str);
printf("str1 = %s \n", str1);
printf("str2 = %s \n", str2);
}
运行结果:
str = C:\Program Files (x86)\Google
str1 = Hello "world"
str2 = Hello 'world'
请按任意键继续. . .
转义字符 | 释义 |
---|
\? | 在书写连续多个问号时使用,防止他们被解析成三字母词 | \’ | 用于表示字符常量’ | \“ | 用于表示一个字符串内部的双引号 | \\ | 用于表示一个反斜杠,防止它被解释为一个转义序列符。 | \a | 警告字符,蜂鸣 | \b | 退格符 | \f | 进纸符 | \n | 换行 | \r | 回车 | \t | 水平制表符 | \v | 垂直制表符 | \ddd | ddd表示1~3个八进制的数字。 如: \130 X | \xdd | dd表示2个十六进制数字。 如: \x30 0 |
void main()
{
char br[] = { 'b', '\0', 'i', 't' };
char cr[] = { 'b', 0, 'i', 't' };
printf("%d\n", strlen(br));
printf("%d\n", strlen(cr));
char ch = '5';
char ch1 = '\5';
}
\0其实就是数字0 运行结果:
1
1
Enter 回车键 \r+\n
\r是表示让光标回到行首
\n是让光标走到下一行
void main()
{
char ch = '\123';
char ch1 = '\1234';
char ch2 = '\183';
printf("%d\n", ch);
printf("%d\n", ch1);
}
运行结果:
83
52
int main()
{
printf("%d\n", strlen("c:\test\328\test.c"));
return 0;
}
运行结果:
14
c : \t e s t \32 8 \t e s t . c
注释
int Add(int x, int y)
{
return x+y;
}
int main()
{
printf("%d\n", Add(1, 2));
return 0;
}
注释有两种风格: C语言风格的注释 /xxxxxx/ 缺陷:不能嵌套注释 C++风格的注释 //xxxxxxxx 可以注释一行也可以注释多行
#if 0
int main()
{
printf("%d\n", strlen("c:\test\328\test.c"));
return 0;
}
#endif
选择语句
void main()
{
int value;
printf("input value:>");
scanf("%d", &value);
if(value > 100)
{
printf("OK.\n");
}
else
{
printf("NO.\n");
}
}
运行结果:
input value:>100
NO.
请按任意键继续. . .
void main()
{
if (-1)
{
printf("-1\n");
}
if (0)
{
printf("0\n");
}
if (1)
{
printf("1\n");
}
}
运行结果:
-1
1
0为假,正数和负数都为真
三种if选择语句格式
if()
{}
if()
{}
else
{}
if()
{}
else if()
{}
else if()
{}
...
else
{}
循环语句
while循环–先判断条件是否成立,再执行循环体
void main()
{
int count = 0;
while (count < 100)
{
printf("count = %d\n", count);
count++;
}
printf("\n");
}
运行结果:
0
1
...
99
do while循环–先执行循环体,再判断条件是否成立
void main()
{
int count = 0;
do
{
printf("count = %d\n", count);
count++;
}while(count < 100);
printf("\n");
}
运行结果:
0
1
...
99
for循环
void main()
{
for (int count = 0; count<100; ++count)
{
printf("count = %d\n", count);
}
}
运行结果:
0
1
...
99
前置++和后置++
前置++,先自身加1,再进行赋值
void main()
{
int value = 0;
int result = ++value;
printf("value = %d\n", value);
printf("result = %d\n",result);
}
运行结果:
value = 1
result = 1
后置++,先进行赋值,再自身加1
void main()
{
int value = 0;
int result = value++;
printf("value = %d\n", value);
printf("result = %d\n", result);
}
运行结果:
value = 1
result = 0
函数
int Add(int a, int b)
{
return a + b;
}
int Sub(int a, int b)
{
return a - b;
}
void main()
{
int a = 10;
int b = 20;
int x = 100;
int y = 200;
int sum = Add(a, b);
int sum1 = Add(x, y);
}
函数的特点就是简化代码,减少代码复用。
数组
定义一个大小为10的整型数组,访问下标是0到9
void main()
{
int ar[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
for (int i = 0; i<10; ++i)
{
printf("%d ", ar[i]);
}
printf("\n");
}
运行结果:
1 2 3 4 5 6 7 8 9 10
操作符
算术操作符
+ - * / %
移位操作符
<< >>
位操作符
& ^ |
void main()
{
int a = 10;
int b = 6;
int res1 = a & b;
int res2 = a | b;
int res3 = a ^ b;
int res4 = ~a;
int res5 = a >> 2;
printf("res1 = %d\n", res1);
printf("res2 = %d\n", res2);
printf("res3 = %d\n", res3);
printf("res4 = %d\n", res4);
printf("res5 = %d\n", res5);
}
运行结果:
res1 = 2
res2 = 14
res3 = 12
res4 = -11
res5 = 2
赋值操作符
= += -= *= /= &= ^= |= >>= <<=
单目操作符
! 逻辑反操作
- 负值
+ 正值
& 取地址
sizeof 操作数的类型长度(以字节为单位)
~ 对一个数的二进制按位取反
-- 前置、后置--
++ 前置、后置++
* 间接访问操作符(解引用操作符)
(类型) 强制类型转换
关系操作符
> >= < <= != ==
逻辑操作符
&& 逻辑与
|| 逻辑或
逻辑与–有假则假
逻辑或–有真则真
void main()
{
int a = 10;
int b = 10;
int result = a || ++b;
printf("result = %d\n", result);
printf("b = %d\n", b);
}
运行结果:
result = 1
b = 10
|| 或运算符左侧为真,则结果必为真,无须执行右侧
void main()
{
int a = 0;
int b = 10;
int result = a && ++b;
printf("result = %d\n", result);
printf("b = %d\n", b);
}
运行结果:
result = 0
b = 10
&& 与运算符左侧为假,则结果必为假,无须执行右侧
条件表达式
exp1 ? exp2 : exp3 //如果exp1成立,则执行exp2,否则执行exp3
int Max(int a, int b)
{
return a > b ? a : b;
}
void main()
{
int val = (1,2,3,4,5,6);
int a = 10;
int b = 20;
int max_value = Max(a, b);
printf("max value = %d\n", max_value);
printf("val = %d\n",val);
}
运行结果:
max value = 20
val = 6
逗号表达式
exp1, exp2, exp3, …expN
下标引用、函数调用和结构体成员
[] () . ->
常见关键字
auto break case char const continue
default do double else enum extern
float for goto if int long
register return short signed sizeof static
struct switch typedef union unsigned void
volatile while
关键字 typedef
typedef 顾名思义是类型定义,这里应该理解为类型重命名
typedef unsigned int u_int;
typedef unsigned int pid_t;
void main()
{
unsigned int a;
u_int aa;
unsigned long b;
}
关键字 static
在c语言中,static是用来修饰变量和函数的
1.修饰局部变量-静态局部变量 2.修饰全局变量-静态全局变量 3.修饰函数-静态函数
void test()
{
static int i = 0;
i++;
printf("%d ", i);
}
int main()
{
int i = 0;
for (i = 0; i < 10; i++)
{
test();
}
return 0;
}
运行结果:
1 2 3 4 5 6 7 8 9 10
int i = 0;
//全局变量,在同一工程下的其他的文件中,extern int i;声明之后就可以使用
void fun()
{}
//全局函数,在同一工程下的其他的文件中,extern void fun();声明之后就可以使用
static int i = 0;
//静态修饰的全局变量,只能在当前文件中使用,即便extern也不行
static void fun()
{}
//静态修饰的函数,只能在当前文件中使用,即便extern也不行
指针
void main()
{
int a = 10;
printf("a address = %p\n", &a);
int *p = &a;
return 0;
}
运行结果:
a address = 00B8F950
请按任意键继续. . .
在32位平台下,指针大小为四个字节,64位平台下,指针大小位八个字节
int main()
{
printf("%d\n", sizeof(char *));
printf("%d\n", sizeof(short *));
printf("%d\n", sizeof(int *));
printf("%d\n", sizeof(double *));
return 0;
}
运行结果:
4
4
4
4
结构体
struct Student
{
char name[10];
int age;
float weight;
};
void main()
{
struct Student s = {"赛文", 10, 120.8};
printf("%s %d %f\n", s.name, s.age, s.weight);
}
运行结果:
赛文 10 120.800003
|