300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 【C语言】运算符与操作符的用法全面汇总(非常有用)

【C语言】运算符与操作符的用法全面汇总(非常有用)

时间:2022-01-01 16:31:41

相关推荐

【C语言】运算符与操作符的用法全面汇总(非常有用)

一.‘->’的用法

“->”是一个整体,它是用于指向结构体子数据的指针,用来取子数据。换种说法,如果我们在C语言中定义了一个结构体,然后申明一个指针指向这个结构体,那么我们要用指针取出结构体中的数据,就要用到“->”。

p=p->next ,意思是将p指向的一个结构体实例中的子数据next赋值给p。

->的作法就是在引用结构体中的变量!

扩展资料:

在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类。结构体可以被声明为变量、指针或数组等,用以实现较复杂的数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员(member),且这些成员可以为不同的类型,成员一般用名字访问。

二.‘[ ]’的用法

数组的下标,定义数组以用于数组操作

比如int a[6];

就是定义一个一维数组,这个数组名叫做 a ,共有6个元素

同理int b[6][6]

就是定义一个二维数组,这个数组共有6*6个元素

三 ‘.’的用法

用在一般结构体变量中,直接调用结构体中的某个成员

如:student.name

扩展资料:

成员运算符(·)和指向结构体成员运算符(->)的区别:

两者都是用来引用结构体变量的成员,但它们的应用环境是完全不一样,前者是用在一般结构体变量中,而后者是与指向结构体变量的指针连用,例如:有定义

struct student

{

long num;

float score;

};

struct student stud, *ptr=&stud;

stud.num、stud.score、ptr->num等都是正确的引用方式,但ptr.num、stud->num就是不允许的,其实ptr->num相当于(*ptr).num,只是为了更为直观而专门提供了这->运算符。

最后指出,这两者都具有最高优先级,按自左向右的方向结合

四 ‘!’的用法

!为逻辑运算符 “非”,用来改变条件的逻辑状态,如果条件为真则改变为假

!a

其运算规则为,

1 如果a的值为0,则运算结果为1;

2 如果a的值非0,则运算结果为0。

举例a!=9 就是a不等于9

五 ‘逻辑与&&和逻辑或||’的用法

&&(与)和 || (或)都是逻辑表达式里常用的,一般用法是if(表达式1 || 表达式2) 或者 if(表达式1 && 表达式2

|| 表示 或 只要有一个非0,整个表达式就为真,就满足if判定的条件

例如 if(1 || 0) ;

1为真 0为假 此判断条件为真

&& 表示 且 if括号内的表达式都为真 才能满足if判定的条件 才会执行if{}里的语句

六.自增运算符++,自减运算符--’的用法

如果单独写 自增运算符为一个语句,二者没有区别

++i; 和 i++; 都是让i+1赋值给i

但是++和--在变量前后的时候,则是会有不同

++在前

例如:++a;

说明:++在前时,b会先自加1,然后才赋值给a

举例:int a, b = 1;

a = ++b;//b增加至2,a得到的值为2

++在后

例如:a++;

说明:++在后时,b赋值给a,再进行自加

举例:int a, b = 1;

a = b++;//b增加至2,a得到的值为1

在操作数之前的操作符(++b)在变量值在被使用之前增加它的值;在操作数之后的操作符(b++)在变量值被使用之后才增加的值。

扩展资料:

++a 与 a++ 不能被赋值 ,因为他们本身只是拷贝了变量的值,并不是变量本身,你无法向一个值进行赋值

int a = 1;

++a = 5;

这样子是错误的!

七.取地址运算符 &和指针运算符*

取地址运算符 &

& 是一元运算符,返回操作数的内存地址。例如,如果 var 是一个整型变量,则 &var 是它的地址。该运算符与其他一元运算符具有相同的优先级,在运算时它是从右向左顺序进行的。

您可以把 & 运算符读作"取地址运算符",这意味着,&var读作"var 的地址"。

和指针运算符*

*运算在C语言中,有两种作用:

1 用作乘法,为双目运算符,形式为a*b, 就是计算数学中的a乘以b。

2 用作取值运算,为单目运算符,根据后续操作数(必须为指针)类型,取其指向的值。

所谓的指针,本质上就是地址。 指针变量的值,就是地址的值,当取值运算时就是到对应的内存地址上,依照指针类型进行取值。

八.长度运算符sizeof’的用法

sizeof操作符计算的是变量(类型)所占空间的大小,是按字节来计算

sizeof是运算符,不是函数

该运算符在编译阶段就已经起作用了。它以字节为单位返回其操作数的大小。它的操作数可以是数据对象也可以是一个类型。如果是类型那么操作数需要用圆括号括起来。

如:sizeof(int)=4;

sizeof(char)等于1

sizeof以byte为单位返回操作数的大小

扩展资料:

(0)sizeof是运算符,不是函数;

(1)sizeof不能求得void类型的长度;

(2)sizeof能求得void类型的指针的长度;

(3)sizeof能求得静态分配内存的数组的长度!

(4)sizeof不能求得动态分配的内存的大小!

(5)sizeof不能对不完整的数组求长度;

(6)当表达式作为sizeof的操作数时,它返回表达式的计算结果的类型大小,但是它不对表达式求值!

(7)sizeof可以对函数调用求大小,并且求得的大小等于返回类型的大小,但是不执行函数体!

(8)sizeof求得的结构体(及其对象)的大小并不等于各个数据成员对象的大小之和!

(9)sizeof不能用于求结构体的位域成员的大小,但是可以求得包含位域成员的结构体的大小!

九.算术运算符+=*/% 和关系运算符><=

这些都很简单,应该不用过多介绍

扩展资料:

单目运算符 双目运算符 三目运算符

单目就是这个运算符只对一个变量进行操作

举例:int a=1;a++;(第二句“a++”则只对a一个变量进行了操作)

双目就是这个运算符对两个变量进行操作

举例:int a=1,b=2,c;c=a+b;(第二句“c=a+b”则是对a,b两个变量进行了操作)

三目就是这个运算符对三个变量进行操作

十.?表达式

条件1 ? 表达式2 : 表达式3

是否满足条件1,如果满足则执行操作2,否则执行操作3。

条件运算符是C语言中唯一的一个三目运算符,其求值规则为:如果表达式1的值为真,则以表达式2 的值作为整个条件表达式的值,否则以表达式3的值作为整个条件表达式的值。条件表达式通常用于赋值语句之中。

我们可以把想成这样

求两个数中最大的一个

if(a>b){

max = a;

}else{

max = b;

}

而用?表达式

max = (a>b) ? a : b;

如a>b为真,则把a赋予max,否则把b 赋予max。

是不是很节约代码,又显的高级

十一.位操作符与位移操作符

C语言提供了六种位运算

1.1按位“与”&(双目运算符):仅当两个操作数都为1时,结果为1,否则为0。参与运算的数以补码方式出现。因为计算机是以补码形式存储数据的

例:9&5=1

0000 1001------------- 9的补码

& 0000 0101------------- 5的补码

----------

0000 0001------------- 1的补码

应用:

a、通常将某些位清零或保留某些位。例如:将a的高八位清零,保留低八位,可做a&255运算。

00000000 11111111—————— 255的二进制数

00000000 00100000—————— a的二进制数

------------------

00000000 11111111

将字符“A”的低四位清零 保留高四位 可以做“A”&240(0xf0)

0100 0001‬——————“A”的二进制数

1111 0000‬——————240的二进制数

------------------

0001 0000 保留了“A”的高四位

b、取某数的指定位。例如:设a=1000 1110,要取出a中第二位的1,则可以用a & 0000 0010 实现。

1.2 按位“或”|(双目运算符):仅当两个操作数都为0时,结果为0,否则为1。

例:9|5=13

0000 1001------------- 9的补码

| 0000 0101------------- 5的补码

----------

0000 1101------------- 13的补码

应用:常用来将源操作数某些位置1。例如:设a=0100 0001,将低四位全部置1,则可以用 a | 0000 1111 实现。

1.3 按位“异或”^(双目运算符):参加运算的两个运算量,如果两个数的相应位的值不同,则该位的结果值为1,否则为0。即:0 ^ 0 =0;0 ^ 1 =1;1 ^ 0 =1;1 ^ 1 =0

例: 9^5=12

0000 1001------------- 9的补码

^ 0000 0101------------- 5的补码

----------

0000 1101------------- 12的补码

应用:

a、特定位置取反。例如:设a=1001,将第2位取反,则可以用 a ^1011 实现。

b、不引入第三变量,交换两个数的值。

例:a=1,b=2,交换两个数的值

a=a^b;

b=a^b;

a=a^b;

1.4按位取反”运算符~

按位取反的意思就是每一位取反,0变1,1变0

所以: ~100 的二进制表示为:1001 1011 所以等号左边=1001 1011

2、移位操作符

2.1 左移运算 <<(丢弃最高位,0补最低位):把一个数的所有位都向左移动若干位。

例如:int i=1;i=i<<2; //这表示将i里的值左移两位。

分析:1的2进制是000...0001(这里1前面0的个数和int的位数有关,32位机器,gcc里有31个0),左移2位之后变成000... 0100,也就是10进制的4,所以说左移1位相当于乘以2,那么左移n位就是乘以2的n次方了(注:有符号数不完全适用)

2.2 右移运算 >>:把一个数的所有位都向右移动若干位。

例如:int i = 0x80000000;

i = i >> 1; //i的值不会变成0x40000000,而会变成0xc0000000

分析:符号位向右移动后,正数的话补0,负数补1,也就是汇编语言中的算术右移。同样当移动的位数超过类型的长度时,会取余数,然后移动余数个位。

十二.‘逗号运算符’的用法

void main(){int a,s,d; s=2; d=3; a=12+(s+2,d+4);}

先算括号内的值:s+2=4,d+4=7;括号内应为(4,7),括号内取值只取最后一个,如果没有括号则取第一个;a=12+7=19。

十三.define和const

define和const的区别:

const 定义的常数是变量,也带类型, #define 定义的只是个常数,不带类型;define是在编译的预处理阶段起作用,而const是在 编译、运行的时候起作用;define只是简单的字符串替换,没有类型检查。而const有对应的数据类型,是要进行判断的,可以避免一些低级的错误;const变量存放在内存的静态区域中,在程序运行过程中const变量只有一个拷贝,而#define 所定义的宏变量却有多个拷贝,所消耗的内存要比const变量的大得多;用define可以定义一些简单的函数,const是不可以定义函数的;define可以用来防止头文件重复引用,而const不能;

const不足的地方,是与生俱来的,const不能重定义,而#define可以通过#undef取消某个符号的定义,再重新定义;

在编译时, 编译器通常不为const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。

补充附录:

32个关键字及其含义:

②剩余格式控制符:

③u8,u16,u32

u8是unsigned char

u16是unsigned short

u32是unsigned int

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。