C语言基础篇 190809-190818
0x00. 环境:vs6.0 c ++,UItraedit,Visual stdio 2019,编译器Clang
Clang命令:
cc -c one.c =>//目标文件
cc one.c =>//可执行文件0x01. 常用关键字:
auto double int struct break else long switch
case enum register typedef char extern return union
const float short unsigned continue for signed viod default
goto sizeof volatile do if while static0x02. 标识符命名规则:
1.只能由26字符,1-9数字,下划线_组成;
2.严格区分大小写,主要不等于主;
3.不能以数字开头;
4.不能用关键字作为标识符;
注释://和/ ** / / ** /;
单双浮点区别:双浮点双=>小数,单浮:1.23F
字符常量:'a','?' 禁止中文;
字符串:“你好,世界!”,双引号;
0x03. 变量:变量类型+变量名,int main()
先定义=>赋值(初始化)
int a;
a=1;定义同时初始化:
int a =1;//const 锁定赋值
#include <stdio.h>
int main()
{
const int a=1;
a=10;
printf ("a's value is :%d",a);
return 0;
}
//将在第6行报错,因为a的值已被锁定.0x04. 进制篇:
标识头:
二进制: 0B
八进制: 0
十六进制: 0x或0X
二进制最大值:2n-1
十六进制:由0-9,A-F组成16位。
0x05. 进制输出:
#include <stdio.h>
int main()
{
int a =021;//八进制,输出为17;
int b = 0x1D;//十六进制,输出为16+13=29;
printf ("a为%d",a);
printf ("b为%d",b);
return 0;
}
example:制作一个输入姓名,年龄,QQ,电话的程序并编译。
#include <stdio.h>
int main()
{
long int age, phonenumber, qqnumber;
char name[20];
printf("please input your name:\n");
scanf_s("%s", name);//字符串以%s输出
printf("please input your age:\n");
scanf_s("%ld", &age);//long int 以%ld输出,int以%d输出,&*为地址
printf("please input your phonenumber:\n");
scanf_s("%ld", &phonenumber);
printf("please input your qqnumber:\n");
scanf_s("%ld", &qqnumber);
printf("success!\n");
printf("your name is :%s\n", name);
printf("your age is :%ld\n", age);
printf("your phonenumber is :%ld\n", phonenumber);
printf("your qqnumber is :%ld\n", qqnumber);
return 0;
}//本代码在Visual stdio 2019里会报错,我并未处理好,在VC6.0里跟linux里正常编译。
/*这种微软的警告,主要因为那些C库的函数,很多函数内部是不进行参数检测的(包括越界类的),微软担心使用这些会造成内存异常,
所以就改写了同样功能的函数,改写了的函数进行了参数的检测,使用这些新的函数会更安全和便捷。关于这些改写的函数你不用专门去记忆,
因为编译器对于每个函数在给出警告时,都会告诉你相应的安全函数,查看警告信息就可以获知,在使用时也再查看一下MSDN详细了解。
*/
print支持的格式符:
%d 以符号的十进制形式输出整数(int)
%c 输出一个字符
%s 输出多个字符 (char)
%f 以小数形式输出单、双精度数,默认小数点后6位 (double)
%0 八进制
%x 十六进制
%w 十进制
%e 标准指数
printf ("agg=%d,no=%d\n",age,no);//输出11位电话号码时不能正常显示,已解决。
原因:int =>long int
//输出email时不能正常显示,已解决。
char=> char email[20];
0x06. 变量与内存.
常用于指针、数组
char 1 1 1
int 2 4 4
float 4 4 4
double 8 8 8
16位编译器 32位编译器 64位编译器例 int b =10;//4字节
char a ="A";//1字节
存储大致:
变量 地址 存储内容
b ffc1 0000 1010
b ffc2 0000 0000
b ffc3 0000 0000
b ffc4 0000 0000
a ffc5 0000 0001
优先分配地址大的。"%p"//输出地址
&a取得变量地址
任何数值内存存储均以补码存储。
正数补码与原码相同,负数为正数原码取反后+1。
0X07. 数值越界:
int main()
{
int c = 1024*1024*1024*4 ;//2e34
printf("%d\n",c);
return 0;
}
=》0.
类型 64位编译器 取值范围
char -2e7~2e7-1
int -2e31~2e31-1
0X08. 说明符:
short/long signed/unsigned
有符号/无符号
short s1=1; == short int s1 =1;
long L=1; == long int L =1;
long int L =1L;
//printf("%ld\n",L);0X09. 自动类型提升与强制类型转换:
//自动类型提升:
int main()
{
int a =10;
double d =a+9.5;
printf("%f\n",d); //将输出19.500000;
return 0;
}
//强制类型转换:
int main ()
{
int a =10.7;
printf("%d\n",a);//将输出10;
return 0;
}
严谨防报错=》int a =(int)10.7; =>10
常见的自动类型提升:
float a =10+3.45f;//float=>double
int b = "A"+32;//long=>int
double c = 10.3f + 5.7;//int=>char
强制类型转换:
int a = 198l;long=>int
char b =65 ;int=>char
0XA. 运算符:+-*/% 优先级:(-) > */% > +-
double a = 10.0/4;=>2.500000 //double/int =>自动类型提升
double b = 10/4; => 2 //int/int =>int =2.000000
//double c = (double)(10/4)=》2.000000% 取余运算符号,如:
-11%2 == 11%-2
11%2 == 11%-2
#include <stdio.h>
int main()
{
int a = -11%2;
int b = -11%-2;
int c = 11%2;
int d = 11%-2;
printf("%d,%d,%d,%d",a,b,c,d);
return 0;
}
0XB. Other运算符
1.复合赋值运算符 :
+= => a+=2; => a= a+2;
-= => a -=2; => a= a-2;
/= => a/=2; => a= a/2;
*= => a*=2; => a= a*2;
%= => a%=2; => a= a%2;2.自增、自减运算符:
++a==a++ => a=a+1;
--a==a-- => a=a-1;
int a =10; => int a=10;
int b =a++; => ≠ int b =++a;
//前者 a=11,b=10,先把a copy存储运算完a++以后再 将存储的a赋值给B
//后者 a=b=11int a =10;
a =++a;
printf ("%d\n",a); => a=103.Sizeof 用来计算一个变量或一个常量、一种数据类型所占内存字节数。
Sizeof (10); Sizeof 常量/变量; Sizeof (float);
Sizeof (int);
char c ='a';
Sizeof (c);int a =sizeof(int);
printf("int's value is:%d\n",a);
4.逗号表达式(,)的值是最后一个表达式的值。
#include <stdio.h>
int main()
{
int a = 2;
int b = 0;
int c;
c = (++a,a*=2,b=a*5);
printf("C's value is:%d ",c);
return 0 ;
}但是要注意 如果不被括号括住,就会变成C=++a从而输出++a =》 a=3.
5.关系运算符 < <= > >= == !=
优先级A. < <= 大于 B. !=
> >= ==
例如:
a = 4 == 3 > 2;
//3>2 => 1
//4 == 1 =>0
// a => 0关系运算符的优先级小于算术运算符
6.逻辑运算符
与&& 或|| 非!
#include <stdio.h>
int main()
{
int a;
a = 10;
if ((a>3)&&(a<5)){
printf("ok");
return 0;
}
else
printf("ok,a's value is %d\n",a);
return 0;
}
7.三目运算符
如:
int a = 3>4?4+5:5>4?5+6:6>7;
printf("a's values is :%d\n",a);
//int a = 0?9:11;,先运算3>4 =》0,那么跳过4+5,开始运算5>4 =1,那么直接取11,否则运算6>7将输出0.
=> a = 118.位运算符
a.按位与& 9&5 <=> 1001&101 =>1 //只有对应两二进制位均为1时结果为1 另 5&5=5; 5&6&7 == 6&5&7
b.按位或| 9|5 <=> 1001|101 =>1101 => 13(只要有一个二进位为1,结果为1) 另 5&5=5; 5&6&7 == 6&5&7
c.按位异或^ 9^5 <=> 1001^0101 =>1101 => 12 (二进位相同为0,不同为1) 另与1相异或取反,与0相异或保持原位,整数异或5^5=0
5^6^7=7^6^5 综上=>5^b^5=b
d.左移<< 整体移位
e.右移>>
f.取反~ ~9=-10,~1=-2 => (规律 ~*=-(*+1) )0XC 流程控制:
一、
if for while else
case switch continue break
if (a>1){
语句1; //一行是可省略大括号
}
//a=0(报错) 应该写成a==0 =》最好写成if(0==a)
二、if else:
if(a>0){
语句一;
}
else {
语句二;
}三、else if
int a = 10;
if (a ==0 ){
printf("a等于0");
}
else if {
printf("a不等于0");
}
四、选择结构switch语句
switch(整数形式表达式)
{
case 数值1;
语句1;
break;
}
int a = 10;
switch(a)
{
case 10:
printf("yes");
case 0: //注意此处为冒号!
printf("no");
break;
} //case内定义变量要加大括号{}。break跳出本循环五、循环语句
a.循环结构while循环
int a = 0;
while(a<=5)
{
a+=1;
printf("a's value is :%d\n",a);
}
return 0;b.do while循环
先执行语句,再进行判断,至少保证一次执行语句
#include<stdio.h>
int main()
{
int a = 0;
do{
a++;
printf("a's value is :%d\n",a);
}while(a<=5);
}//注意while后面有个;c.for循环
#include<stdio.h>
int main()
{
int a;
for(a=1;a<=3;a++)
{
printf("a's value is :%d\n",a);
}
} //仅先执行一次语句a=1,然后循环条件a<=3,然后语句为a++如果多函数:for(int x=0,y=0;x<3,y<3;x++,y+=2)
六、break,continue
break只影响所在for循环。
#include<stdio.h>
int main()
{
int i =0;
for(i;i<5;i++)
{
printf("i's value is :%d\n",i);
if (i>=2)
{
break;//结束整个for
}
}
}continue://只影响所在for的循环
#include<stdio.h>
int main()
{
int a=0,i=0;
for(i;i<100;i++)
{
a++; //此项如果放在if语句后,将只输出1-50,放在此处输出1-99
if(i%2==1)
{
continue; //所以可以总结出continue是跳出if循环并继续,若没有则不会输出a的新值
}
printf("i's value is :%d\n",i);
printf("我跳出if循环了,我的值是%d\n",a);
}
}
0xD. 函数
int sum(int a,int b){
return a+b;
}
int main()
{
int c = sum(1,5);
return 0;
}
//main.c+sum.c => main.exe
//main.c:
int main.c()
{
int sum(int,int);
int c = sum(10,11);
printf("c is %d\n",c);
return 0;
}
//sum.c:
int sum(int a,int b)
{
return 0;
}
分开链接 需要在Include目录下添加sum.h 并在main.c里包含即可调用函数。
scanf传递的是地址不是变量,所以scanf(%d,&age);
批量数据存储
一堆数组,形式:类型 数组名 [元素个数]
#include <stdio.h>
int main()
{
int b [5]={1,2,3,4,5};//数组初始化
printf("b[0]为:%d\n",b[0]);
printf("b[1]为:%d\n",b[1]);
printf("b[2]为:%d\n",b[2]);
printf("b[3]为:%d\n",b[3]);
printf("b[4]为:%d\n",b[4]);
}注意:
1.常量|常量表达式均可,禁止变量|变量表达式
2.允许下标越界。int a [4]={1,2};
初始化合集:
按行: int a[2][3]={{2,2,3},{3,4,5}};
按顺序: int a[2][3]={2,2,3,3,4,5};
按部分:int a[2][3] = { {2}, {3, 4} };
int b[3][3] = { { }, { , , 2}, {1, 2, 3}};
#include <stdio.h>
int main()
{
int a[2][3]={{1,2,3},{4,5,6}};
printf("第一行第一个为%d,第二行第一个%d\n",a[0][0],a[1][0]);
printf("第一行第二个为%d,第二行第二个%d\n",a[0][1],a[1][1]);
printf("第一行第三个为%d,第二行第三个%d\n",a[0][2],a[1][2]);
printf("this list is:\n%d,%d,%d\n%d,%d,%d,",a[0][0],a[0][1],a[0][2],a[1][0],a[1][1],a[1][2]);
return 0;
}
可以省略行数,不能省略列数!
字符串篇: puts与prinft,gets与scanf
字符串初始化:
puts:一次只能输出一个字符串,printf可以同时输出多个字符串
字符串的输入:
scanf:
gets:
- gets一次只能读取一个字符串,scanf则可以同时读取多个字符串
- gets可以读入包含空格、tab的字符串,直到遇到回车为止;scanf不能用来读取空格、tab

还不快抢沙发