分析方法:后缀运算符++优先级高于前缀运算符++和*,后缀运算符++结合规律从左至右(即先返回值再自增),前缀运算符++和*的优先级相同,结合规律自右至左。

举例如下:

#include <stdio.h>

int main(int argc, char *argv[])
{
        int arrayA[4] = {4, 3, 2, 1};
        int *p1 = NULL, *p2=NULL;
        /* 1: *(p++)与*p++相同 */
        p1 = arrayA, p2 = arrayA;
        printf("第一次:*(p1++)=%d *p2++=%d\n", *(p1++), *p2++);
        printf("第二次:*(p1++)=%d *p2++=%d\n", *(p1++), *p2++);
        /*打印结果:
        第一次:*(p1++)=4 *p2++=4
        第二次:*(p1++)=3 *p2++=3
        分析:后缀运算符++优先级高,第一次执行*p1++时,p1++表示先取值后p1再自增,p1
        取到的值和*结合取出p1指向地址的值,即arrayA首地址的值,即4。第二次执行时p1自增后
        指向arrayA[1]的地址,所以取值为3
        */
        
        /* 2: *(++p)与*++p相同: */
        p1 = arrayA, p2 = arrayA;
        printf("*(++p1)=%d *++p2=%d *p1=%d *p2=%d\n", *(++p1), *++p2, *p1, *p2);
        /*打印结果:
        *(++p1)=3 *++p2=3 *p1=4 *p2=4
        */
        
        /* 3: ++*p与++(*p)相同:注意,printf函数打印自右向左, */
        p1 = arrayA, p2 = arrayA;
        printf("arrayA[0]=%d ++*p1=%d ++(*p2)=%d *p1=%d *p2=%d\n", arrayA[0], ++*p1, ++(*p2), *p1, *p2);
        /*打印结果:
        arrayA[0]=6 ++*p1=6 ++(*p2)=5 *p1=4 *p2=4
        分析:printf函数打印自右向左,首先执行++(*p2),先对p2指向地址的值进行++运算,即将
        arrayA[0]的值++运算后变成5,因++*p与++(*p)结合规则是相同的,p1也是指向arrayA[0]地址,
        所以++*p1后arrayA[0]的值变成6。
        */
        
        /* 4: (*p)++ */
        p1 = arrayA;
        printf("arrayA[0]=%d, (*p1)++=%d (*p1)++=%d *p1=%d\n",arrayA[0], (*p1)++, (*p1)++, *p1);
        /*打印结果:
        arrayA[0]=8, (*p1)++=7 (*p1)++=6 *p1=6
        分析:printf函数打印自右向左,(*p1)++先取出p1指向地址的值打印,然后再将p1指向地址的值++运算。
        */
        
        /* 5: ++复杂用法
            ++(*p)++:  不合法:自增操作数必须是左值
            ++(*++p++):不合法:自增操作数必须是左值
            ++(++*p++):
            ++(*p++):
            (++*p++):
        */
        p1 = &arrayA[1];
        printf("前:arrayA[1]=%d arrayA[2]=%d\n" ,arrayA[1], arrayA[2]);
        printf("++(*p1++)=%d ++*p1++=%d *p1=%d\n",++(*p1++), ++*p1++, *p1);
        printf("后:arrayA[1]=%d arrayA[2]=%d\n" ,arrayA[1], arrayA[2]);
        /*打印结果:
        前:arrayA[1]=3 arrayA[2]=2
        ++(*p1++)=3 ++*p1++=4 *p1=3
        后:arrayA[1]=4 arrayA[2]=3
        分析:先执行++*p1++:后缀运算符的优先级高于前缀运算符,所以p1++先结合,返回p1指向的地址和*
        结合后再和前面的++结合将该地址的值自增运算,即将arrayA[1]中的数由3变为4,执行完后p1指向&arrayA[2]
        再执行++(*p1++):()的优先级最高,先执行(*p1++),因()中后缀运算符++的优先级高于*,
        p1++先结合,先取值后自增,(*p1++)先取arrayA[2]地址中的值为2,在和前面的++结合将
        该地址的自增运算后变为3.
        */
        
        return 0;
}

C语言:*(p++)与*p++ *(++p)与*++p ++*p与++(*p) (*p)++的区别相关推荐

  1. 编译语言与解释语言,动态与静态,以及强类型和弱类型的区别

    编译和解释的区别是什什么? 编译器是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机 可以直接以机器语言来运行此程序,速度很快; 而解释器则是只在执行程序时,才一条一条的解释 ...

  2. c语言char有什么作用,C语言中char*和char[]用法区别分析

    本文实例分析了C语言中char* 和 char []的区别.分享给大家供大家参考之用.具体分析如下: 一般来说,很多人会觉得这两个定义效果一样,其实差别很大.以下是个人的一些看法,有不正确的地方望指正 ...

  3. bs后端开发语言_哪种编程语言适合后端开发?Java和PHP的区别在哪?

    从技术上看在web开发上,Java和PHP哪个更好呢? 一位从多年PHP开发转Java的技术人员说,应是各有千秋,各有各的好处,这是非常实际的答案. java已经是一门很成熟的语言,曾经看到一篇文章, ...

  4. lisp语言cond和if套用_方案 – if和cond之间的区别?

    but when running, cause error: procedure application: expected > procedure, given: #; arguments w ...

  5. C语言—字符串与字符数组,字符串数组与字符串指针的区别

    字符串与字符数组 字符串一定是一个char的数组,但char的数组未必是字符串.--以字符'\0'结尾的char数组就是一个字符串,但如果char数组没有以'\0'结尾,那么就不是一个字符串,只是普通 ...

  6. html是一种纯文本类型语言,什么是HTML格式、纯文本格式,有什么区别呢?

    满意答案 lyqstart 推荐于 2017.11.29 采纳率:46%    等级:6 已帮助:709人 Hypertext Markup Language,中文也就是超文本链接标示语言.HTML( ...

  7. C语言 exit(0)与exit(1)、return区别

    exit(0):正常运行程序并退出程序: exit(1):非正常运行导致退出程序: return():返回函数,若在主函数中,则会退出函数并返回一值. 详细说: return返回函数值,是关键字: e ...

  8. C语言输入不同字符 屏幕显示不同,c语言中易混淆的东西 1 getch() getche()和getchar()之间区别 scanf sscanf (fscanf fgets fgetc )...

    getch() getche()和getchar()之间区别 发布人 : IT专家 发布时间 : 2009-10-21 07:52:23.0 首先不要忘了,要用getch()必须引入头文件conio. ...

  9. C/C++语言中点运算符(.)和箭头运算符(->)的区别(代码展示)

    之前有学过C#或VB语言的小伙伴对点运算符(.)应该不陌生,即当我们定义了一个结构体时,想要访问结构体里面的成员,我们只要在结构体名称后面加上一个点运算符(.),系统则自动将结构体里面的内容罗列出来, ...

  10. NPL程序设计语言,CNN,RNN,LSTM ,spark和hadoop的区别,云计算,kubeflow

    目录 NPL程序设计语言 深度学习框架建模:CNN,RNN,LSTM spark和hadoop的区别 云计算

最新文章

  1. JAVA里tokens意思_Java TokenMetadata.sortedTokens方法代码示例
  2. 利用JS将页面指定部分存为HTML页
  3. ado.net 修改,查询
  4. 5.非关系型数据库(Nosql)之mongodb:创建集合,备份与导入导出, 数据还原,导入导出
  5. 最大子序和—leetcode53
  6. SSH连接linux时,长时间不操作就断开的解决方案
  7. Xshell显示中文乱码问题
  8. Ruby学习-第二章
  9. EfficientNet 解析:卷积神经网络模型尺度变换的反思
  10. Storm目录树和任务提交过程
  11. HDU 6090 Rikka with Graph 思维 公式
  12. 计算机一级选择题题库百度云,2017年全国计算机一级选择题题库
  13. 【数字IC】深入浅出理解UART协议
  14. 基于微信驾校考试小程序系统设计与实现 开题报告
  15. 查找list中重复数据
  16. 做个网站要多少钱,怎么收费的?
  17. u盘正常接入后计算机无法看到,能识别U盘但显示不出来的解决办法【详解】
  18. vue项目中axios配置(代理配置)
  19. MATLAB GUI设计II 多功能模式题目生成器 四则运算 | 界面切换 | 字符串处理 | cell数组 | GUI
  20. 【观察】联想HPC:独步青云之后,重在行业普惠

热门文章

  1. “读芯术”精华文章汇总:专业知识
  2. 简单局域网聊天室--Java版
  3. Hacked by 1BYTE
  4. 批量打印二维码的软件---使用心得(领跑条码标签打印软件)
  5. 官方老爹之痛:为什么苹果能收到推送,而安卓不行?
  6. Latex使用总结(待完善)
  7. Mapbox相机动画整理(1)示例解析
  8. 惠普ZBook 14u G5(3XG37PA)电脑 Hackintosh 黑苹果efi引导文件
  9. 猜数字?我要王者荣耀
  10. 疯狂的程序员-第二十三章