四.变量
4.1变量的基础
变量在程序中用变量名表示,变量名由用户根据其用途任意命名。
变量名由字母、数字、下划线组成,不能以数字开始,不能和C的关键字重名。
在程序运行时,变量占据存储空间的大小由其数据决定
变量在内存空间中的首地址,称为变量的地址。
4.2变量的说明
变量在程序中使用时,必须预先说明它们的存储类型和数据类型。
说明的一般形式是:
<存储类型> <数据类型> <变量名>;
<存储类型> 是关键词 auto 、register、static和 extern 。
<数据类型>可以是基本数据类型, 也可以是 自定义的数值。
4.3变量的存储类型
4.3.1 auto
auto int k ;
int j;
double x ;
4.3.2 register
称为寄存器型,register变量想将变量放入CPU的寄存器中,这样可以加快程序的运行速
度。
如申请不到就使用一般内存,同auto
register变量必须是能被CPU所接受的类型。这通常意味着register变量必须是一个单个的
值,并且长度应该小于或等于整形的长度。
不能用“&”来获取register变量的地址。
由于寄存器的数量有限,真正起作用的register修饰符的数目都依赖于运行程序的机
器。
在某些情况下,把变量保存在寄存器中反而会降低程序运行速度。因为被占用的寄存
器不能在用于其他目的,或者变量被使用的次数不够多,不足以装入和存储变量所带
来的额外开销
4.3.3 static
static变量称为静态存储类型的变量,既可以在函数体内,也可在函数体外说明情况。(默
认为0)
局部变量使用static修饰有以下特点:
在内存中以固定地址存放,而不是以堆栈形式存放
只要程序没有结束,就不会随着说明他的程序段的约束而消失,它下次再调用该函
数,该存储类型的变量不会重新说明,而且还保留上次调用存储。
4.3.4 extern
当变量在一个文件中的函数体外说明,所有其他文件中的函数或程序段都可引用这个变
量。
extern称为外部参照引用型,使用extern说明的变量是想引用在其他文件的中函数体外外
部声说明的变量。(记得声名 //ectern int a;)
static修饰的全部变量,其他文件无法使用。
五.运算符
5.1 算数运算符
C语言提供的算数运算符: + 、- 、 * 、 / 、% 、++ 如:(float、double 不能取余)
#include<stdio.h>
int main()
{
int a=15,b=8,x,y,z,m,n;
x=a+b;
y=a-b;
z=a/b;
m=a*b;
n=a%b;
printf("x=%d y=%d z=%d m=%d n=%d",x,y,z,m,n);
}
5.2 关系运算符
C语言的关系运算符如下:
#include<stdio.h>
int main()
{
int a=15,b=8,x,y,z,m,n,q;
x=a>b;
y=a>=b;
z=a<b;
m=a<=b;
n=a==b;
q=a!=b;
printf("x=%d y=%d z=%d m=%d n=%d q=%d",x,y,z,m,n,q);
}
逻辑运算符 “!” 运算符的运算律如下:
#include<stdio.h>
int main()
{
int a=6,b=0,x,y,z,m,n;
x=!a;
y=a&&b;
z=a||b;
m=(a+!b)&&(a||b);
printf("x=%d y=%d z=%d m=%d",x,y,z,m);
return 0;
}
逻辑与 “&&” 运算符的运算规律如下:短路特性-逢0截止
#include<stdio.h>
int main()
{
int a=6,b=0,x,y,z,m,n;
x=(a>=3)&&(b>!a);
y=(b>1)&&(a==6);
z=(b<a)&&(b>a);
m=(a>0)&&!(b>=a);
printf("x=%d y=%d z=%d m=%d",x,y,z,m);
return 0;
}
逻辑或 ”||“ 运算符的运算规律如下:短路-逢1截止
#include<stdio.h>
int main()
{
int a=6,b=0,x,y,z,m,n;
x=(a>=3)||(b>!a); //10
y=(b>1)||(a==6); //01
z=(b<!a)||(b>a); //00
m=(a>0)||!(b>=a); //11
printf("x=%d y=%d z=%d m=%d",x,y,z,m);
return 0;
}
5.4 位运算
C语言的位运算如下:(对二进制进行操作)
位运算反 ”~“ 运算符
#include<stdio.h>
int main()
{
unsigned char a=0x17,x=0;
x=~a;
printf("x(10)=%x x(16)=%#x",x,x);
return 0;
}
位运算与 ”&“ 运算符的运算规律如下:
#include<stdio.h>
int main()
{
unsigned char a=0126,b=0xac,z;
z=a&b; //&操作于二进制码
printf("z=%d\n",z);
}
位运算与 ”| 运算符的运算规律如下:
#include<stdio.h>
int main()
{
unsigned char a=076,b=0x89,z;
z=a|b; //&操作于二进制码
printf("z=%d\n",z);
}
位逻辑异或”^“运算符的运算规律如下:相同为假,不同为真
#include<stdio.h>
int main()
{
unsigned char x=75,y=0173,z;
z=x^y;
printf("z=%d\n",z);
return 0;
}
位运算的一般形式
<运算量> <运算量><表达式>其中 :
<运算量>必须为整形结果数值;
<运算符>为左移(<<)或右移(>>)运算符;
<表达式>也必须为整形结果数值
#include<stdio.h>
int main()
{
unsigned char x=0xe4,z;
z=x<<3;
printf("z=%d\n",z);
return 0;
}
如何快速把一个无符号位快速置1或者置0?
5.5 赋值运算符
赋值运算符为”=“,其运算的一般形式如下:
<左值表达式> = <右值表达式>
赋值复合运算符其运算的一般形式如下:
<变量> <操作符> = <表达式>
C语言的赋值复合运算符如下:
#include<stdio.h>
int main()
{
int count,sum;
count =0,sum=0;
while(count++<100)
{
sum+=count;
}
printf("sum=%d\n",sum);
return 0;
}
5.6 特殊运算符
5.6.1 条件运算符
”?: “是三目运算符,其运算的一般形式是:
<表达式1 >?<表达式2>:<表达式3>
#include<stdio.h>
int main()
{
int x=82,y=101,a,b;
a=(x>y? x+18 : y-100);
b=(x<(y-11)? x-22:y-1);
printf("a=%d b=%d\n",a,b);
return 0;
}
#include<stdio.h>
int main()
{
int x,y=25;
x=70;
y=x++>70?100:0;
printf("x=%d y=%d\n",x,y);
return 0;
}
5.6.2 逗号运算符
#include<stdio.h>
int main()
{
int x=10,y=25,m,n,q;
m=(x=y=5,x+=1); //x=x+1 其中x由前面可知为5 故x=5+1=6
n=(x=1,y=3,q=0); //n的值由最后一个式子的结果决定
printf("m=%d n=%d\n",m,n);
return 0;
}
5.6.3 sizeof运算符
运算符的一般形式:sizeof(类型或变量名)
注意:它只针对数据类型,而不针对变量 用以求出某一数据类型所占字节数
#include<stdio.h>
int main()
{
int a;
char b;
long c;
printf("a=%d b=%d c=%d\n",sizeof(int),sizeof(char),sizeof(long));
return 0;
}
5.6.4 C运算符的优先级
#include<stdio.h>
int main()
{
int x=1,y=0,z=0,m,n,q;
m=(x++ && y++ || ++z);
n=(!(x+1 >0) && y++ || ++z);
q=(x+=y==z,y=x+2,z = x+y+z>0);
printf("m=%d n=%d q=%d\n",m,n,q);
return 0;
}
技巧小课堂:
像z++,++z这种,++在前先自增再进行式子的计算,如果++在后就先进行式子的计算,然后再进行自增
++在前,先自增
++在后,先计算