初始C语言第三节
这章笔记主要包括操作符和关键字
± \pm ± ∗ \ast ∗ / %(取模)`
int main(){
int a=7/2;
printf("%d\n",a);//结果是3
float f=7/2;
printf("%f\n",f);//结果还是3
return 0;
}
/(除号)操作符两端的操作数都是整数,执行的是整数除法,如果至少有一个操作数是浮点数,执行的才是浮点数除法;
int main(){
float f=7.0/2;
//7/2.0;
printf("%f\n",f);//结果还是3.5000;
return 0;
}
%(取模)操作符
关注的是除法后的余数;%操作符两端的操作数必须是整数;
移位操作符:<< >>
整数,可以写成二进制,可以将二进制位移动;
比如:
int a=-1;
a<<1;//表示将a的二进制数向左移动一位;
位操作符:(二进制位)
=
复合赋值符+= -= *= /= &= ^= |= >>= <<=
int main(){
int a=10;//创建变量,并初始化;
a=20;//赋值
return 0;
}
单目操作符:有一个操作数
ps:双目操作符就是两个操作数;
c语言如何表示真假的呢?
0表示假,非0表示真;
int main(){
int a=10;
if(a)
printf("hehe\n");
if(!a)
printf("haha\n");
}
-(负号)
int main(){
int a=-10;
printf("%d\n",+a);//-10;
printf("%d\n",-a);//10;
}
sizeof:以字节为单位;
int main(){
int a=10;
char c='w';
int arr[10]={0};
printf("%d\n",sizeof(a));//4
printf("%d\n",sizeof(c));//1
printf("%d\n",sizeof(arr));//40
printf("%d\n",sizeof(int));//4
printf("%d\n",sizeof(char));//1
int sz=sizeof(arr)/sizeof(arr[0]);//10,数组元素的个数
printf("%d\n",sz);
}
sizeof后面括号中写的是变量的名字就可以把括号省略掉,如果后面是变量的类型就不能省略掉;
sizeof是一个操作符不是一个函数!!(因为一定条件下括号可以省略掉);
strlen是库函数,只能针对字符串,求字符串长度,计算的字符串中\0之前的字符个数;
sizeof是操作符,是计算所占内存空间的大小;
前置++:先++后使用;
后置++:先使用后++;
int main(){
int a=10;
int b=++a;
//a=a+1; b=a;先++后使用;
int c=a++;
//c=a; a=a+1;//先使用后++;
printf("%d\n",a);
printf("%d\n",b);
printf("%d\n",c);
}
(类型):强制类型转换;
int main(){
int a=3.14;//err 3.14默认为double类型,a是int型
int a=(int)3.14;//强制类型转换;合理使用
return 0;
}
int main(){
char arr1[]="abcdef";
char arr2[]="adcdef";
if(arr1==arr2){
printf("==\n");
}
else
{
printf("!=\n");//结果是!=表示两个字符串是不能用==来判断相等的;
}
}
字符串比较必须使用strcmp库函数来比较;
int main(){
char arr1[]="abcdef";
char arr2[]="adcdef";
if(strcmp(arr1,arr2)==0){
printf("==\n");
}
else
{
printf("!=\n");
}
double也不能直接用==来比较
逻辑操作符:只关注真假
&&逻辑与–并且;
||逻辑或–或者;
条件操作符:
int main(){
int a=10;
int b=0;
if(a>5)
b=3;
else
b=-3;
//(a>5)?(b=3):(b=-3);//相当于选择结构
b=(a>5?3:-3);
printf("%d\n",b);//b=3;
}
exp1,exp2,exp3…expN
逗号表达式的特点:从左向右以此计算,整个表达式的结果是最后一个表达式的结果;
int main(){
int a=3;
int b=5;
int c=0;
int d=(a+=2,b=b-c+a,c=a+b);//结果是15 a=5,b=10, c=5+10;
printf("%d\n",d);
return 0;
}
int main(){
int arr[10]={0};//0~9
arr[4]=5;//4[arr]语法也是支持的;
//arr 4是[]的两个操作数
//2+3
//2+3是+的操作数
//下标引用操作符
}
int Add(int x,int y){
return x+y;
}
int main(){
int c=Add(2,3);//()是函数调用操作符,操作数是Add,2,3;
printf("c=%d\n",c);
}
函数调用操作符的括号不能省略;
1.关键字是直接使用的
2.变量名不能是关键字
auto:自动—自动变量的
局部变量都是自动创建自动销毁的,所以局部变量都是auto修饰的;
auto一般省略掉;
循环:
break:case break continue default–默认 do while for while
基本数据类型:
char short int…signed----有符号的 unsigned—无符号的 void 无类型
修饰变量,指针:
const
选择分支:
if else goto
自定义类型:
enum–枚举
extern–是用来申明外部符号的;
register—寄存器关键字
return —返回
sizeof—操作符
static—静态的,修饰变量
struce----结构体
typedef----类型重定义
union—联合体/共用体
volatile
register的作用:
int main(){
//建议把10放在寄存器中
register int a=10;
return 0;
}
typedef—类型重定义 复杂的类型简单化`
typedef unsigned int uint;
int main(){
unsigned int num;
uint num2;
return 0;
}
static关键字:
1.修饰局部变量:
static修饰后的局部变量只能在自己所在的.c文件内部使用
void test(){
int a=3;
a++;
printf("%d\n",a);
}
int main(){
int i=0;
while(i<10){//结果打印出来是10个4
test();
i++;
}
return 0;
}
在这里int a变量没有声明为static,在test函数内部属于局部变量,进入函数自动创建,出函数自动销毁,所以打印结果是10个4;
但是如果将int a声明为static类型结果如下
void test(){
static int a=3;
a++;
printf("%d\n",a);
}
int main(){
int i=0;
while(i<10){//结果打印出来是4,5,6,7,8,9,10,11,12,13
test();
i++;
}
return 0;
}
普通的局部变量是放在内存的栈区上的,栈区存储的是临时变量,进入局部范围,变量创建,除了局部范围,变量销毁
当static修饰局部变量时,局部变量是在静态区开辟空间的,这时的局部变量,出了作用域变量不销毁,下次进去作用域,使用的还是上一次遗留的数据
(改变了存储位置,由栈区–>静态区,使得生命周期发生了变化)直到整个程序结束才会销毁;
2.修饰全局变量:
全局变量是具有外部链接属性的,如果全局变量被static修饰,这个外部链接属性就变成了内部链接属性。
其他源文件就没法通过链接找到这个符号的
3.修饰函数
函数是具有外部链接属性的,其他源文件想使用函数只需要正确的声明(函数形式参数只需要写出参数类型即可),但是函数被static修饰,外部链接属性就变成了内部链接属性,这个时候函数只能在自己所在的.c文件内部使用,不能被其他文件使用;
链接属性分为:
外部链接属性—外部文件均可以看到
内部链接属性—static
无链接属性—局部变量
这章笔记主要包括一些常用的操作符以及常见关键字的理解和使用,希望对大家有帮助!