C语言:*(p++)与*p++ *(++p)与*++p ++*p与++(*p) (*p)++的区别
分析方法:后缀运算符++优先级高于前缀运算符++和*,后缀运算符++结合规律从左至右(即先返回值再自增),前缀运算符++和*的优先级相同,结合规律自右至左。
举例如下:
#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)++的区别相关推荐
- 编译语言与解释语言,动态与静态,以及强类型和弱类型的区别
编译和解释的区别是什什么? 编译器是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机 可以直接以机器语言来运行此程序,速度很快; 而解释器则是只在执行程序时,才一条一条的解释 ...
- c语言char有什么作用,C语言中char*和char[]用法区别分析
本文实例分析了C语言中char* 和 char []的区别.分享给大家供大家参考之用.具体分析如下: 一般来说,很多人会觉得这两个定义效果一样,其实差别很大.以下是个人的一些看法,有不正确的地方望指正 ...
- bs后端开发语言_哪种编程语言适合后端开发?Java和PHP的区别在哪?
从技术上看在web开发上,Java和PHP哪个更好呢? 一位从多年PHP开发转Java的技术人员说,应是各有千秋,各有各的好处,这是非常实际的答案. java已经是一门很成熟的语言,曾经看到一篇文章, ...
- lisp语言cond和if套用_方案 – if和cond之间的区别?
but when running, cause error: procedure application: expected > procedure, given: #; arguments w ...
- C语言—字符串与字符数组,字符串数组与字符串指针的区别
字符串与字符数组 字符串一定是一个char的数组,但char的数组未必是字符串.--以字符'\0'结尾的char数组就是一个字符串,但如果char数组没有以'\0'结尾,那么就不是一个字符串,只是普通 ...
- html是一种纯文本类型语言,什么是HTML格式、纯文本格式,有什么区别呢?
满意答案 lyqstart 推荐于 2017.11.29 采纳率:46% 等级:6 已帮助:709人 Hypertext Markup Language,中文也就是超文本链接标示语言.HTML( ...
- C语言 exit(0)与exit(1)、return区别
exit(0):正常运行程序并退出程序: exit(1):非正常运行导致退出程序: return():返回函数,若在主函数中,则会退出函数并返回一值. 详细说: return返回函数值,是关键字: e ...
- C语言输入不同字符 屏幕显示不同,c语言中易混淆的东西 1 getch() getche()和getchar()之间区别 scanf sscanf (fscanf fgets fgetc )...
getch() getche()和getchar()之间区别 发布人 : IT专家 发布时间 : 2009-10-21 07:52:23.0 首先不要忘了,要用getch()必须引入头文件conio. ...
- C/C++语言中点运算符(.)和箭头运算符(->)的区别(代码展示)
之前有学过C#或VB语言的小伙伴对点运算符(.)应该不陌生,即当我们定义了一个结构体时,想要访问结构体里面的成员,我们只要在结构体名称后面加上一个点运算符(.),系统则自动将结构体里面的内容罗列出来, ...
- NPL程序设计语言,CNN,RNN,LSTM ,spark和hadoop的区别,云计算,kubeflow
目录 NPL程序设计语言 深度学习框架建模:CNN,RNN,LSTM spark和hadoop的区别 云计算
最新文章
- JAVA里tokens意思_Java TokenMetadata.sortedTokens方法代码示例
- 利用JS将页面指定部分存为HTML页
- ado.net 修改,查询
- 5.非关系型数据库(Nosql)之mongodb:创建集合,备份与导入导出, 数据还原,导入导出
- 最大子序和—leetcode53
- SSH连接linux时,长时间不操作就断开的解决方案
- Xshell显示中文乱码问题
- Ruby学习-第二章
- EfficientNet 解析:卷积神经网络模型尺度变换的反思
- Storm目录树和任务提交过程
- HDU 6090 Rikka with Graph 思维 公式
- 计算机一级选择题题库百度云,2017年全国计算机一级选择题题库
- 【数字IC】深入浅出理解UART协议
- 基于微信驾校考试小程序系统设计与实现 开题报告
- 查找list中重复数据
- 做个网站要多少钱,怎么收费的?
- u盘正常接入后计算机无法看到,能识别U盘但显示不出来的解决办法【详解】
- vue项目中axios配置(代理配置)
- MATLAB GUI设计II 多功能模式题目生成器 四则运算 | 界面切换 | 字符串处理 | cell数组 | GUI
- 【观察】联想HPC:独步青云之后,重在行业普惠