二、基础内容
2、词法符号
2.1、运算符
2.1.1、算术运算符
+ - * / % ++ --
1、/:相除,结果取整数部分
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a=5/2;
printf("a=%d\n",a);
float b=5/2;
printf("b=%f\n",b);
float c=5.0/2;
printf("c=%f\n",c);
float d=(float)5/2; //强制转换只会改变一次
printf("d=%f\n",d);
float e=5/2;
printf("e=%f\n",e);
return 0;
}
2、%:相除,结果取余数
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a=5%2;
printf("a=%d\n",a);
float b=5%2;
printf("b=%f\n",b);
float e=5%2;
printf("e=%f\n",e);
return 0;
}
3、++/--:
单独成句:
#include<stdio.h>
int main()
{
int a=9;
a++;
int b=5;
b=b+1;
int c=2;
++c;
printf("a=%d\nb=%d\nc=%d\n",a,b,c);
return 0;
}
在赋值语句中:
++在后:先赋值后算数
++在前:先算数后赋值
#include <stdio.h>
int main(int argc, char const *argv[])
{
int a = 9;
int b = a++; // = +
printf("a=%d b=%d\n", a, b); // 10 9
int c = 9;
int d = ++c; // + =
printf("a=%d c=%d\n", c, d); // 10 10
return 0;
}
2.1.2、逻辑运算符
与或非:&& || !
1、0为假,非0为真
#include<stdio.h>
int main()
{
printf("%d\n",2>3); // 0 假
printf("%d\n",12>3); // 1 真
printf("%d\n",2>3 && 12>3);
printf("%d\n",!(2>3)); // 非假则真
printf("%d\n",!3); // 0 非真则假
return 0;
}
2、截断法则:
逻辑与:
前面结果为假,后面表达式不再执行,返回假
逻辑或:
前面结果为真,后面表达式不再执行,返回真
#include<stdio.h>
int main()
{
int a=1,b=2,c=3,d=4,m=2,n=2;
(m=a>b) && (n=c>d);
printf("%d",n);
return 0;
}
2.1.3、位运算符
转换成二进制,每一位相互比较
整数的三种表现形式:
原反补:正数相同,只看负数原码:自身二进制数,给人看的
反码:原码除符号位外其余取反
符号位:首位,1为负数
补码:反码+1,遵循二进制加减规则
计算机中整数以补码进行储存和计算,所以补码是给机器看的
//假设int类型是1个字节 #include <stdio.h> int main() { int a = 15; // 原码:0000 1111 int b = -12; // 原码:1000 1100 // 反码:1111 0011 // 补码:1111 0100 int c = a & b; // 15: 0000 1111 // -12: 1111 0100 // &: 0000 0100 // 4: 0100 printf("%d\n", c); // 4 }
& 位与 全1则1,有0则0
#include<stdio.h>
int main()
{
int a=15; //15:1111
int b=12; //12:1100;
int c=a & b; //&:1100==>12
printf("c=%d",c); //c=12
int d=-12;
int e=a&d;
printf("e=%d",e);
return 0;
}
| 位或 有1则1,全0则0
^ 异或 相同为0,不同为1
~ 取反 1变成0,0变成1
<< 左移 左移n位,右边补零
>> 右移 右移n位,右边丢弃
#include<stdio.h>
int main()
{
int a=6;
int b=-6
int c=a<<2;
//6:110 11000 24
//6*2*2=24
int d=b<<2;
//-6*2*2=-24
int e=a>>2;
//6:110 110>>2==>1 1
//6/(2*2)=1
int f=b>>2;
//-6/(2*2)=-2
printf("c=%d\nd=%d\ne=%d\nf=%d\n",c,d,e,f);
return 0;
}
置一公式:
a|(1<<n)
置零公式:
a&(~(1<<n))
#include<stdio.h> int main() { int a=12; //1100 int b=12; //1100 for(int n=0;n<4;n++) { a=a|(1<<n); //1100 | 0001 1101 n==0 //1101 | 0010 1111 n==1 //1111 | 0100 1111 n==2 //1111 | 1000 1111 n==3 b=b&(~(1<<n)); //1100 & 1110 1100 n==0 //1100 & 1101 1100 n==1 //1100 & 1011 1000 n==2 //1000 & 0111 0000 n==3 } printf("%d %d\n",a,b); return 0; }
2.1.4、关系运算符
> >= < <= == !=
= 赋值 == 等于
2.1.5、三目运算符
表达式1?表达式2:表达式3
判断表达式1是否成立,
成立执行表达式2
不成立执行表达式3
#include<stdio.h>
int main()
{
int a=5,b=9;
int max=a>b?a:b;
printf("%d\n",max);
return 0;
}
2.1.6、赋值运算符
= += -= *= /= %=
a-=5; //a=a-5;
2.1.7、运算符的优先级
单算移关与,异或逻条赋
单目运算符:++ -- ! ~
算术运算符:+ - * / %
移位运算符:<< >>
关系运算符:> >= < <= == !=
位与运算符:&
异或运算符:^
位或运算符:|
逻辑运算符:&& ||
条件运算符:……?……:……
赋值运算符:=
补充:逗号运算符
顺序计算,计算值为最后一个表达式的值
2.2、关键字
2.2.1、储存类型
auto static extern register
虚拟内存空间
32位:4G
64位:2^64字节 有效2^48字节
储存区
栈区 函数体内部定义的变量
堆区 程序员手动开辟
全局区/静态区 函数体外部定义的变量
常量区 char *p="hello";
2.2.2、数据类型
int char short long float double signed unsigned
2.2.3、分支语句
if else switch case default
2.2.4、循环语句
for do while go to break continue
2.2.5、构造数据
struct union enum
2.2.6、其他类型
void const sizeof volatile return typedef
2.3、标识符
命名规则
由字母数字下划线组成
开头不能是数字
不能与关键字重名
见名知意
2.4、分隔符
空格 tab \n
2.5、标点符号
英文输入法
3、变量常量
3.1、变量
int a; 运行过程中会发生变化
格式
储存类型 auto 决定储存位置
数据类型 int 决定开辟的空间大小
数据类型
char int
short long float double 1b 4b 2b 32位:4b
64位:8b
4b 8b -2^7~2^7-1 四个字节32位 有效位数6-7 15-16位 1字节 =8位 1111 1111 0-255 256个数 0111 1111 -128-127printf("%d\n",sizeof(char));
变量名 a 遵循标识符命名规则
3.1.1、全局变量与局部变量
区别:
区别 | 局部变量 | 全局变量 |
定义位置 | 函数内部 | 函数外部 |
初值(定义未赋值) | 随机数 | 0 |
作用域 | 仅作用于函数内部 | 作用于整个程序 |
存储位置 | 栈区 | 全局区/静态区 |
生命周期 | 函数返回,变量消失 | 程序结束,变量消失 |
3.2、常量
3.2.1、整型常量
十进制 八进制 十六进制
3.2.2、字符常量
由' '引用 '\'转义字符
#include<stdio.h>
int main()
{
char a='A';
printf("%c\n",a); // A
printf("%d\n",a); // 65
printf("%c\n",'\\'); // \
printf("%c\n",'\101'); // A 八进制
printf("%c\n",'\x41'); // A 十六进制
}
3.2.3、字符串常量
由" "引用
字符串由每个字符组合而成,字符串默认以\0为结束标志,定义数组时要为\0留空位。
3.2.4、浮点型常量
float double
3.2.5、标识常量——宏定义
格式
#define 宏名 常量值或表达式或函数
宏名一般用大写,以便与普通变量区分
常量值
注意:先进性单纯的替换,在进行计算
#include<stdio.h>
#define N 5
#define M N+2
#define NUM N+M*3
int main()
{
printf("%d\n",N);
printf("%d\n",M);
printf("%d\n",NUM);
return 0;
}
上述程序就是典型的先替换后计算:第四行表达式里的M先替换为N+2,此时表达式为NUM=N+N+2*3,计算结果为16.
表达式
#include<stdio.h>
#define N a>b?a:b
int main()
{
int a=5,b=7;
printf("%d\n",N);
a=55;
b=99;
printf("%d\n",N);
return 0;
}
此过程还可以用宏函数来实现
#include<stdio.h>
#define N(a,b) a>b?a:b
int main()
{
printf("%d\n",N(5,7));
printf("%d\n",N(55,99));
return 0;
}