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

一.‘->’的用法

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

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

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

 

【C语言】运算符与操作符的用法全面汇总(非常有用)_第1张图片

扩展资料:

在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语言提供了六种位运算

位运算符

含义

举例

&(and)

按位与

a&b

|   ( or )

按位或

a|b

^   ( xor )

按位异或

a^b

~  ( not )

按位取反

~a

<<   (  shi )

左移

a<<1

>> (  shr  )

右移

a>>1

 

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,也就是汇编语言中的算术右移。同样当移动的位数超过类型的长度时,会取余数,然后移动余数个位。

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

 

操作符 功能
exp1,exp2,…expN 从左往右依次执行,整个表达式结果是最后一个表达式的结果

 

 

  1. void main()
  2. {
  3.     int a,s,d;
  4.     s=2;
  5.     d=3;
  6.     a=12+(s+2,d+4);
  7. }

先算括号内的值: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个关键字及其含义:

auto  声明自动变量 一般不使用 
double  声明双精度变量或函数 
int 声明整型变量或函数 
struct 声明结构体变量或函数 
break 跳出当前循环 
else  条件语句否定分支(与 if 连用) 
long  声明长整型变量或函数 
switch  用于开关语句 
case 开关语句分支 
enum  声明枚举类型 
register 声明积存器变量 
typedef 用以给数据类型取别名(当然还有其他作用) 
char  声明字符型变量或函数 
extern 声明变量是在其他文件正声明(也可以看做是引用变量) 
return 子程序返回语句(可以带参数,也看不带参数) 
union 声明联合数据类型 
const  声明只读变量 
float 声明浮点型变量或函数 
short  声明短整型变量或函数 
unsigned 声明无符号类型变量或函数 
continue 结束当前循环,开始下一轮循环 
for: 一种循环语句(可意会不可言传) 
signed 生命有符号类型变量或函数 
void  声明函数无返回值或无参数,声明无类型指针(基本上就这三个作用) 
default 开关语句中的“其他”分支 
goto 无条件跳转语句 
sizeof 计算数据类型长度 
volatile 说明变量在程序执行中可被隐含地改变 
do  循环语句的循环体 
while  循环语句的循环条件 
static  声明静态变量 
if 条件语句
   

 

②剩余格式控制符:

%d    整形
%f 浮点型(实型)
%lf 双精度
%hd 短整型
%ld 长整型
%u 无符号输出
%- 左对齐
%m 按m个字宽输出
%s 输出字符串
%0 空位补0
%x   十六进制格式输出
%o 八进制格式输出
%e  指数形式输出
%g 智能输出(%f || %e 选择最优输出方案)
%c 输出字符
%p   十六进制形式输出变量地址
%.n 保留小数点后n位or截取字符串前n位

③u8,u16,u32

u8是unsigned char

u16是unsigned short

u32是unsigned int


 


 

你可能感兴趣的:(c语言学习,运算符,操作符,关键字,C语言)