精华内容
下载资源
问答
  • int *ip; // ip is a pointer to int ... //y is now 1,一元操作符*是间接引用或者是解引用操作符(注:对指针进行解引用操作获得该指针所指向的对象) *ip = 0; // x is now 0 ip = &z[0]; // ip now points to z[0]
       int *ip;          // ip is a pointer to int 
      ip = &x;          //ip now points to x 一元操作符&给出对象的地址,ip就成为了x的地址
       y = *ip;          //y is now 1,一元操作符*是间接引用或者是解引用操作符(注:对指针进行解引用操作获得该指针所指向的对象)
       *ip = 0;          // x is now 0
       ip = &z[0];       // ip now points to z[0] 
    
    展开全文
  • C语言学习——运算符详解

    千次阅读 2020-04-13 22:13:15
    C语言学习——运算符与表达式 一、学习运算符 (1)运算对象的数目 C语言中,运算符的运算对象可以是一个,称单目运算符;运算对象也可以是两个,称双目运算符;运算对象还可以是三个,称三目运算符。 (2)运算符的...

    C语言学习——运算符详解

    在这里插入图片描述

    一、学习运算符

    (1)运算对象的数目
    C语言中,运算符的运算对象可以是一个,称单目运算符;运算对象也可以是两个,称双目运算符;运算对象还可以是三个,称三目运算符。

    (2)运算符的位置
    单目运算符若放在运算对象的前面,称为前缀运算符;若放在运算对象的后面,称为后缀运算符。
    双目运算符都是放在两个运算对象的中间,称为中缀运算符。
    三目运算符在C语言中只有一个(?:),是夹在三个运算对象之间的。

    (3)运算对象的数据类型
    每个运算符对每个运算对象的数据类型均有明确的要求,如果运算对象的数据类型不正确,则可能会出现语法上的错误,或者运算结果错误。

    (4)运算规则
    每个运算符有特定的运算规则,即对运算对象进行什么样的运算或加工加工。

    (5)运算结果的数据类型
    每个运算符的运算结果也有确定的数据类型。
    运算结果的数据类型一般称为运算符的数据类型。例如,运算结果是数值型的运算符称为算术运算符,运算结果是逻辑值(真或假)的称为关系运算符或逻辑运算符等等。

    (6)运算符的优先级。
    当用多个运算符连接了多个运算对象时,就会碰到哪个运算符先算,哪个运算符后算的问题,我们把这个问题称为运算符的优先级。
    C语言规定了每个运算符的优先级别,并规定优先级高的运算符要先计算。同时,还规定了圆括号的优先级别高于任何运算符,即用圆括号括住的部分首先计算。若在圆括号中又有圆括号,则内层圆括号优先于外层圆括号。

    (7)运算符的结合性。
    优先级别相同的运算符也会出现先算和后算的问题,在C语言中称为“结合性”。
    C语言规定了同级别运算符的结合性有两种:自左向右和自右向左。若结合性是“自左向右”的,则按照自左向右的顺序,先碰到谁先算谁;若结合性是“自右向左”的,则按照自右向左的顺序,先碰到谁先算谁。

    (8)下列少数运算符号有双重含义:

    + 在算术运算中既表示“取正”运算, 又可表示“加法”运算;在指针运算中表示“加法”运算。
    -  在算术运算中既表示“取负”运算, 又可表示“减法”运算;在指针运算中表示“减法”运算。
    * 在算术运算中表示“乘法”运算;在指针运算中表示“指针”运算。
    & 在位逻辑运算中表示“与”运算;在指针运算中表示“取地址”运算。
    

    二、学习表达式

    表达式是用运算符把运算对象连接起来组成的合法运算式。其中的运算对象可以是常量、变量,也可以是表达式,从而能构造出非常复杂的表达式。

    (1)正确构造表达式的规则如下:

    1、单个的常量、变量、函数调用都是表达式;
    2、前缀单目运算符 表达式
    3、表达式 后缀单目运算符
    4、表达式 双目运算符 表达式
    5、表达式?表达式:表达式(其中的? :是三目运算符)
    6、有限次使用上述规则获得的运算式也是表达式。
    

    (2)表达式计算中数据类型的自动转换规则:
    在这里插入图片描述
    上述转换规则可以简称“就长不就短”的自动转换规则。即首先将参加运算的两个运算对象中,数据长度短的运算对象自动转换成数据长度长的数据类型,然后进行计算。计算结果值当然就是数据长度长的运算对象的数据类型。

    (3)表达式的运算规则
    表达式的运算规则其实就是其中运算符的运算规则及其优先级和结合性。
    构造表达式时,在需要的地方可以用增加圆括号的方式来改变计算的顺序。

    (4)表达式的值
    每个表达式都可以按照运算规则进行运算,并最终获得一个值,称为表达式值。
    要特别注意C语言的任何表达式都有值。

    (5)表达式的类型
    表达式值的数据类型就称为表达式类型。
    就已经学过的知识来看,C语言表达式的类型只有字符型、整型、实型。其中字符型和整型可以合称为整型表达式,整型表达式和实型表达式又可以合称为数值型表达式。以后还会学习指针(地址)型表达式等。

    (6)表达式的分类
    从构成表达式的运算符来划分,C语言的表达式可以分为:算术表达式、赋值表达式、关系表达式、逻辑表达式、逗号表达式和条件表达式等。
    当表达式中出现多个运算符时,按优先级和结合性最后一个计算的运算符就是区分表达式类别的。例如,最后计算的是“算术运算符”,则是算术表达式;最后一个计算的是“赋值运算符”,则是赋值表达式。

    三 、算术运算符和表达式

    在这里插入图片描述
    (1)算术运算符的优先级别规定如下:
    ● 单目基本算术运算符 优先于 双目基本算术运算符。
    ● *、/、% 优先于 +(加)、-(减)。
    ● +(取正)、-(取负) 是同级别的,结合性是自右向左的。
    ● *、/、% 是同级别的,结合性是自左向右的。
    ● +(加)、-(减) 是同级别的,结合性是自左向右的。

    说明:
    1、对于除( / ):两整数相除,结果为整数,有一个为实型,结果为实型。要求分母不为0。
    2、对于模(%):要求两侧均为整型数据,余数符号与被除数相同。

    5/2      = 2
           -5/2.0 = -2.5
            5%2    = 1
            5%-2   = 1
           -5%2    =  -1
           -5%-2    =  -1
            1%-10   =  1
            5%1    =  0
            5.5%2      ()
    

    (2)增1减1运算符

    ++ --可以前置,也可以后置。 
    前置  ++i, --i  (先增减后引用)
    后置  i++,i--   (先引用后增减)
    
    int a, i=1;
    a=i++; //表达式值1,a=1,i=2
    a=++i; //表达式值2,a=2,i=2
    

    使用增1减1运算符时,需要注意下列几点:

    • 增1(或减1)运算符作为前缀使用时,是先对运算对象加1(或减1),然后再使用加1(或减1)后的运算对象。
    • 增1(或减1)运算符作为后缀使用时,是先使用运算对象的原值,然后再对运算对象加1(或减1)。
    • “++(++变量)、++(–变量)、–(++变量)、–(--变量) ”
      在语法上是错误的,因为前一个“++或–”运算符的运算对象已经不是变量了,而是一个表达式。
    • 当出现难以区分的若干个+或-组成一串运算符时,C语言规定,自左向右取尽可能多的符号组成合法运算符。
    • 当“++”或“–”出现在某个变量后面,则先取变量的值参加表达式计算。只有整个表达式计算结束后,才对变量进行加1或减1的操作。

    程序:

    
       j=2;k=++j;	/*j=3 k=3*/
       j=2;k=j++;	/*j=3 k=2*/
    
       j=2;printf(%d %d\n”, j++,++j ); /*3 3 printf语句表达式是从右至左执行*/ 
       j=2;printf("%d %d\n", ++j,j++ ); /*3 2*/
    
       j=2,k=1;
       printf("%d...", j+++k );  /*3...*/
       j=2,k=1;
       printf("%d\n", (j++)+k );/*3...*/
    }
    

    四、关系运算符和表达式

    (1)关系运算符:

    • 种类:< <= == >= > !=
    • 结合方向:自左向右
    • 优先级别:< <= > >= == !=
    • 关系表达式的值:逻辑值“真”或“假”,用1和0表示

    (2)注意区分“=”与“==”

    #include <stdio.h>      
    void main( void )
    {
    int a=0,b=1;
    if(a=b)  //a=b结果为1     
    printf("a  equal  to  b\n");
    else         
       printf("a  not  equal  to b\n");
    }
    
    
    #include <stdio.h>
    void main( void )
    {
    int a=0,b=1;
    if(a==b)    //a==b结果为0    
    printf("a  equal  to  b\n");
    else         
       printf("a  not  equal  to b\n");
    }
    
    

    五、逻辑运算符和表达式

    (1)逻辑运算符

    • 种类: ! && ||
    • 运算量: 0表示“假”,非0表示“真”
    • 运算结果: 0表示“假”, 1表示“真”
    • 逻辑运算真值表:
    ab!a!ba&&ba//b
    非0非00011
    非000101
    0非01001
    001100
    • 优先级:! && ||
    • 结合方向:! (自右向左) && ||(自左向右)
    • 逻辑表达式求解时,并非所有的逻辑运算都执行,只是在必须执行下一个逻辑运算才能求出表达式的解时,才执行该运算
      例 a&&b&&c //只在a为真时,才判别b的值;只在a、b都为真时,才判别 c的值
      例 a||b||c //只在a为假时,才判别b的值;只在a、b都为假时,才判别 c的值

    例如程序:

    #include <stdio.h>
    
    void main( void )
    {
       int a=1, b=2, c=3, d=4, m=1, n=1;
    
            (m=a>b)&& (n=c>d);
           printf(" m=%d n=%d\n",  m, n );
    }
    

    运行解果: 分析:(m=a>b)的结果为0,0和任意表达式“与”运算均为0,故n=c>d没有运算,n的值仍为1!
    在这里插入图片描述

    六、逗号运算符和表达式

    • 形式: 表达式1,表达式2,……表达式n
    • 结合性: 从左向右
    • 优先级: 最低
    • 逗号表达式的值:等于表达式n的值
    • 用途:常用于循环for语句中
    例  a=3*5,a*4         //a=15,表达式值60
          a=3*5,a*4,a+5   //a=15,表达式值20
    例  x=(a=3,6*3)       //赋值表达式,表达式值18,x=18
          x=a=3,6*a       //赋值表达式,表达式值18,x=3
    

    七、条件运算符与条件表达式

    格式: e1 ? e2 : e3

    在这里插入图片描述

    八、长度运算符和数据类型转换运算符

    (1)长度运算符(sizeof)

    • 形式: sizeof 数据对象; sizeof(类型说明符);
    
    设变量定义如下:char c;   int i;        short s;  
                   long l;   float f;     double d;
    
     则:    sizeof(c)的值是1         sizeof(i)的值是4
            sizeof(s)的值是2          sizeof(l)的值是4
            sizeof(f)的值是4          sizeof(d)的值是8
            sizeof(unsigned int)的值是4      
            sizeof(unsigned short)的值是2
            sizeof(unsigned long)的值是4
    

    (2)数据类型转换运算符(强制类型转换)

    • 功能:将某个表达式的运算结果转换为另一种数据类型
    • 形式:(数据类型符)(表达式 ) ;例: (int) (a/b)
      说明:
      ⑴ 表达式必须加圆括号。
      ⑵ 长度长的数据转换为长度短的数据时,将截取超长的部分,会造成数据值的改变。
    设变量定义如下:
    char c=1;   int i=2;        short s=3;    
    long l=4;   float f=5.0;    double d=6.0;
     
    则:
    (float)c的值是1.0,单精度实型,而c的值仍然是1,字符型。
    (short)l的值是4,带符号的短整型,而变量l仍然是4,带符号长整型。
    (int)(s/f)的值是0,带符号整型,变量s和f的类型与值均不改变。
    (int)s/f的值是0.6,双精度实型,变量s和f的类型与值均不改变。
    (long)(i+d)的值是8,带符号长整型,变量i和d的类型与值均不改变。
    
    展开全文
  • (a)是合法的,后置递增运算符的优先级高于解引用运算符,其含义是解引用当前迭代器所处位置的对象内容,然后把迭代器的位置向后移一位。 (b)是非法的,解引用迭代器iter得到vector对象的当前元素,结果是一个...

    假设iter的类型是vector<string> :: iterator,说明下面的表达式是否合法。如果合法,表达式的意思是什么?如果不合法,错在何处?

    (a) * iter++;

    (b) (* iter)++;

    (c) *iter.empty( );

    (d) iter->empty( );

    (e) ++*iter;

    (f) iter++->empty( );

    (a)是合法的,后置递增运算符的优先级高于解引用运算符,其含义是解引用当前迭代器所处位置的对象内容,然后把迭代器的位置向后移一位。

    (b)是非法的,解引用迭代器iter得到vector对象的当前元素,结果是一个string,显然string没有后置递增操作。

    (c)是非法的,解引用运算符优先级低于点运算符,所以该式先计算iter.empty(),而迭代器没有定义empty函数,所以无法通过编译。

    (d)是合法的,iter->empty();等价于(*iter).empty();。解引用迭代器得到当前所指元素,结果是一个string,显然字符串可以判断是否为空,empty函数在此处有效。

    (e)是非法的,该式先解引用iter,得到迭代器当前所指元素,结果是一个string,显然string没有后置递增操作。

    (f)是合法的,iter++->empty();等价于(*iter++).empty();。含义是解引用迭代器当前位置的对象内容,得到一个字符串,判断该字符串是否为空,然后把迭代器向后移一位。

    展开全文
  • 1、 首先C语言运算符有哪些? 2、运算符的优先级 首先不同优先级运算符的结合顺序是按照上图中运算符优先级来的,也就是说()或者 [ ] 一定比 * 的优先级高,搞清这个指针函数(数组)或者函数指针(数组)就可以...

    平时工作中其实真正要去判断运算符优先级的次数几乎没有(也许是我目前工作年限或者经历较少的原因),但是在面试题中会经常遇到。以前一直觉得没什么用,后面慢慢的觉得C语言基础真的很重要,也许这就是我能力不足的原因之一吧!OK! 那我就分享下,我如何学习这一块的(主要是难记)

    1、 首先C语言运算符有哪些?
    在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

    2、运算符的优先级

    首先不同优先级运算符的结合顺序是按照上图中运算符优先级来的,也就是说()或者 [ ] 一定比 *
    的优先级高,搞清这个指针函数(数组)或者函数指针(数组)就可以清楚地分清了,在后面我们说这部分的时候在细说。

    然后同一优先级的运算符的结合顺序按照结合方向来判断。例如:

    *a++是先执行++运算,再执行 *, 即指针先移动一个位置,在对移动后指针所指位置解引用取值(从右到左)

    OK,关于运算符的优先级就说到这里,大家可以在实际代码中实践

    最后就是我觉得最重要的,有的同学说照着表我肯定都知道的,考试或者面试的时候遇到咋办呢!!!

    我自己有一套觉得记优先级的方法,分享一下!!!

    1)括号>单目>双目>三目>赋值运算符>,

    2)双目 又分为 算数运算符 关系运算符 逻辑运算符

    3)结合方向从右到左的 只有 单目,三目以及赋值运算符

    这个方法应该是可以简单记下大部分的。

    个人方法只是参考,还是需要在代码中实操才是王道

    3、最后贴两个自己面试中遇到的相关题目,大家可以练练手试试
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 求字节数运算符 用于计算数据类型所占的字节数(sizeof)。 一、sizeof的概念 sizeof是c语言的一种单目操作符,如c语言的其他操作符++、--等。并且它并不是一个函数,sizeof的操作符以字节的形式给出了操作数的储存...
  • C语言中&运算符和*运算符详解 文章目录C语言中&运算符和*运算符详解前言一、取址运算符&与间接运算符*1.取址运算符&2.间接运算符*3.优先级与结合律二、左值与右值三、总结 前言 在学习C Primer ...
  • C语言的指针 指针就是地址,指针也是C语言的一种数据类型。...* :指针运算符,也称为“间接引用操作符”,它返回指针指的变量的值。 1.取地址运算符 & & 是一元运算符,返回操作数的内存地址。如果操作
  • ->:间接引用运算符

    2018-06-26 23:18:00
    换种说法,如果我们在C语言中定义了一个结构体,然后申明一个指针指向这个结构体,那么我们要用指针取出结构体中的数据,就要用到“->”.举个例子:struct Data{ int a,b,c;}; /*定义结构体*/struct Data * p;/*...
  • 取址运算符&用来取得其操作数的地址。如果操作数 x 的类型为 T,则表达式 &x 的类型是 T 类型指针(指向 T 的指针)。取址运算符的操作数必须是在内存中可寻址到的地址...
  • c语言运算符的优先级和结合性常常被人混淆一谈,本文目的在于简单谈谈两者的区别。本文举几个简单的例子说明,这些运算符也特别常用。 首先要明白的是:优先级决定表达式中各种不同的运算符起作用的优先次序;...
  • 因为指针有时也称为引用,所以*运算符也可以描述为对指针进行解引用。 &是解地址,*是解引用。 指针声明由:(指针指向地址的数据类型 * 指针名) 组成 //声明变量并初始化 int value = 1; //定义指针 int * p;...
  • C语言学习——运算符

    2021-03-04 15:43:09
    C语言学习——运算符 运算符的分类: 赋值运算符:=、+=、-=、=、/=、%=(余等于) 算数运算符:+、-、*、/、%(取余)、++、– int a = 10; printf("%d\n",++a)//11 printf("%d\n",--a)//10 printf("%d\n",a++)//10 ...
  • * 解引用操作,表示指向一个变量。 (类型) 强制类型转换 二、位运算 计算机中的数在内存中都是以二进制形式进行存储的,用位运算就是直接对整数在内存中的二进制位进行操作,因此其执行效率非常高,在程序中尽量...
  • C语言指针解引用注意事项

    千次阅读 2018-05-14 11:03:47
    在指针的操作中,间接运算符*,也被称为解引用运算符。注意事项最重要的一点是:不要解引用未初始化的指针如:int * pt;//未初始化的指针*pt=5;//这句话是错的为什么是错的,因为第2行的意思是把5储存在pt指向的...
  • 前言:C语言是最为复杂的语言,一些简单的运算看似简单,但是往往比较易错难懂,弄明白运算符的优先级是学习后面很多内容的基础,本文将C语言的的运算符做了一个较为全面的汇总。特别像是指针运算,如果对于运算符的...
  • [1]来说,一共有四步,其中包含了两次地址移动,两次解引用,执行顺序是:地址移动->解引用->地址移动->解引用(这里提一句,[]的结合性是左结合的,所以在移动的时候先移动行(第一维)再移动列(第二维),小声BB...
  • C语言运算符总结心得

    2017-03-26 09:48:02
    一、逻辑运算符: 包括:①&&逻辑与 ②||逻辑或 ③!逻辑非 逻辑运算符用于对包含关系运算符的表达式进行合并或取非 对于使用逻辑运算符的表达式,返回0表示“假”,返回1表示“真”。关于逻辑运算符的解释 请...
  • 本博文接着细讲述C语言的下一个知识点:运算符。 作者:小 琛 欢迎转载,请标明出处 引言:给操作符一个简单的分类: 算术操作符 移位操作符 位操作符 赋值操作符 单目操作符 关系操作符 逻辑操作符 条件...
  • 这样写可以让编译器帮我们隐式翻译成*(a+b) 那么问题是会对这块地址取值,解引用,但是这个地址是不安全的,因为这不是指针,实际地址就是a的值+b的值,但是这不是我们想要的,上面说了用&,只要在前面加一个&编译...
  • 在优先级中自增运算符的优先级比解引用的优先级高 #include using namespace std; int main(){ int a[10] = { 2,7,4,8,5,1,3,8 }; int *p = a; for (int i = 0; i ; i++) printf("%d", (*p)++); cout <<
  • C语言运算符

    2018-12-11 15:12:14
    *(引用) &(取地址运算符/解引用) !(逻辑非) ~(按位取反) ++ -- (type) sizeof ------------------------------------------------------------------------------------- char *p = "i am a boy"; char a = *p+...
  • 二、逻辑运算符 ! 重要考点:1、&&如果表达式1为假,则表达式二不计算 2、||如果表达式一为真,则表达式二不计算 3、0为假,非0为真 4、 (1)++a:先+1 (2) a++:...
  • C语言运算符的总结

    2017-03-26 10:13:38
     C语言中包含如下几种算数操作符,下面来一一认识 + - * / %  以上操算数操作符中除了 % 操作符之外,其他的几个操作符可以作用于整数和浮点数 对于 / 操作符如果两个操作数都为整数,执行整数除法。而只要...
  • C++中箭头运算符->,相当于把解引用和成员访问符两个操作符结合在一起,换句话说, p->func()和(*p).func()所表示的意思一样。 例如: class A { public: func(); } class B { A *p = new A(); *p.a(); //或者...
  • )、解引用(*)与引用(&) C++ 提供了两种指针运算符,一种是取地址运算符 &,一种是间接寻址运算符 *。 指针是一个包含了另一个变量地址的变量,您可以把一个包含了另一个变量地址的变量说成是"指向"另一个...
  • 运算符*和++都属于单目运算符,两者的优先级是一样的,结合性的方向是从右到左。 首先,关于++运算符的特性,我们需要了解一下。 ++在前,则变量先自身加1,然后参与所在表达式的其它运算; ++在后,则变量首先参与...
  • 如何快速记忆C语言运算符

    千次阅读 2019-04-26 07:44:01
    结构体解引用 . 结构体引用 最后还有一些杂项符号,它们要么用途多变(如 , ),要么由于各种原因没法归类,所以一并列在下面。 杂项运算符 描述 , 逗号 ( ) 圆括号 ...
  • C语言操作符思维导图

    2019-04-01 19:31:56
    C语言操作符 算术操作符 + 可以作用于整数和浮点数 - 可以作用于整数和浮点数 * 可以作用于整数和浮点数 / 如果两个操作数都为整数,执行整数除法。只要有浮点数,就执行浮点数除法 % 两个操作数必须为整数。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 7,926
精华内容 3,170
关键字:

c语言解引用运算符

c语言 订阅