*p++与(*p)++与*(p++)

news/2025/3/14 19:14:59/
这个问题其实是论述*P++等价于(*p)++还是等价于*(p++)的问题,为了验证这个问题,我编写了下面的小程序(vc++6.0编译环境),作为验证
程序1
#include "stdio.h"
void  main()
{
    
int a=2
;
    
int *p=&
a;
    
int *pold;//记录P指向的地址,为了作为比较使用

    pold= p;
    
//-----------原来的信息

    printf("原来的a=%d " ,a);
    printf(
"原来的p=%x "
,p);
    printf(
"原来的pold=%x "
,pold);
    
//----------进行变化

    printf("*p++的结果=%d,a的结果a=%d ",*p++ ,a);
    printf(
"地址变化的结果p-pold=%x ",p-
pold);
}
运行结果是:
程序2
#include  " stdio.h "
void  main()
{
    
int  a = 2 ;
    
int   * p =& a;
    
int   * pold; // 记录P指向的地址,为了作为比较使用
    pold = p;
    
// -----------原来的信息
    printf( " 原来的a=%d " ,a);
    printf(
" 原来的p=%x " ,p);
    printf(
" 原来的pold=%x " ,pold);
    
// ----------进行变化
    printf( " (*p)++的结果=%d,a的结果a=%d " ,( * p) ++ ,a);
    printf(
" a的结果a=%d " ,a);
    printf(
" 地址变化的结果p-pold=%x " ,p - pold);
}
运行结果
程序3
#include  " stdio.h "
void  main()
{
    
int  a = 2 ;
    
int   * p =& a;
    
int   * pold; // 记录P指向的地址,为了作为比较使用
    pold = p;
    
// -----------原来的信息
    printf( " 原来的a=%d " ,a);
    printf(
" 原来的p=%x " ,p);
    printf(
" 原来的pold=%x " ,pold);
    
// ----------进行变化
    printf( " a=%d,(*p)++的结果=%d,a的结果a=%d " ,a,( * p) ++ ,a);
    printf(
" a的结果a=%d " ,a);
    printf(
" 地址变化的结果p-pold=%x " ,p - pold);
}
运行结果:
程序4
#include  " stdio.h "
void  main()
{
    
int  a = 2 ;
    
int   * p =& a;
    
int   * pold; // 记录P指向的地址,为了作为比较使用
    pold = p;
    
// -----------原来的信息
    printf( " 原来的a=%d " ,a);
    printf(
" 原来的p=%x " ,p);
    printf(
" 原来的pold=%x " ,pold);
    
// ----------进行变化
    printf( " *(p++)的结果=%d,a的结果a=%d " , * (p ++ ),a);
    printf(
" a的结果a=%d " ,a);
    printf(
" 地址变化的结果p-pold=%x " ,p - pold);
}
运行结果:
程序5
#include  " stdio.h "
void  main()
{
    
int  a = 2 , * p =& a, * q =& a;
    printf(
" %d %d  " ,( * p),a);
    printf(
" %d %d %d " , * p ++ ,( * p) ++ , * q ++ );
    printf(
" %d " ,a); 
}

运行结果

程序6

#include  " stdio.h "
void  main()
{
    
int  a = 2 , * p =& a, * q =& a;
    printf(
" %d %d  " ,( * p),a);
    printf(
" %d %d %d " ,( * p) ++ , * p ++ , * q ++ );
    printf(
" %d " ,a); 
}

运行结果:

程序7:

#include  " stdio.h "
void  main()
{
    
int  a = 2 , * p =& a, * q =& a;
    printf(
" %d %d  " ,( * p),a);
    printf(
" %d %d %d %d " ,( * p) ++ , * p ++ , * q ++ ,a);
    printf(
" %d " ,a); 
}

运行结果:

程序8:

#include  " stdio.h "
void  main()
{
    
int  a = 2 , * p =& a, * q =& a;
    printf(
" %d %d  " ,( * p),a);
    printf(
" %d %d %d  " , * p ++ ,( * p) ++ , * q ++ );
    p
=& a;q =& a;
    printf(
" %d %d %d %d " ,a, * p,( * q) ++ ,a); 
    printf(
" %d %d %d  %d " ,a, ++ ( * p), ++ ( * q),a); 
    printf(
" %d " ,a);
    
}

运行结果: 

综上所述:
*p++是先取出*p的值,然后让p++
(*p)++是先取出*p的值,让这个值++
*(P++)是先取出*p的值,让p++
所以,*p++等价于*(P++)
而且printf的运行顺序是从右向左运行。而且++是在整个运算表达式运算完才进行,而且右++的执行顺序是从左到右进行。而左++遇到变量就会立即增加变量的值。
验证printf的运算顺序
#include  " stdio.h "
void  main()
{
    
int  a = 2 ;
    printf(
" a++=%d,++a=%d,a++=%d " ,a ++ , ++ a,a ++ );
    printf(
" a=%d " ,a);
}
运行结果:
剩下的工作就是你自己慢慢体会了。

http://www.ppmy.cn/news/173665.html

相关文章

韩国三星GALAX SIII发布有感

5月4日3点12分,看完韩国三星公司新款智能手机发布会,有感。 这款智能手机的系统配置如下: SamsungI9300 Galaxy S III at a glance: General:GSM 850/900/1800/1900 MHz, UMTS 850/900/1900/2100 MHz, HSDPA 21Mbps, HSUPA 5.76 Mbps; 4G (r…

三星固态硬盘PRO 和 EVO的区别

三星固态硬盘PRO和EVO简单来说定位有所区别,PRO定位高端旗舰型号,EVO定位亲民大众型号。我从官方客服得到答案是,EVO用的是闪存颗粒是Samsung V-NAND 3bit MLC,PRO用的闪存颗粒是Samsung V-NAND 2bit MLC,而实际Samsun…

关于++p和p++

p:先引用后增加,先在p所在的表达式中使用p的当前值,后让p加1. p:先增加后引用,让p先加1,然后在i所在的表达式中使用i的新值. 一般变量 比如 a是先输出再,故先输出1,然后输出2&…

850pro测试软件,三星850Pro ssd可靠性测试 6000次P/E

泡泡网SSD固态硬盘频道7月8日 三星前不久发布了850 Pro固态硬盘,性能提升并不明显,但是850 Pro它使用的是三星第二代的V-NAND闪存。测试显示其P/E循环寿命达到了6000次,大约是目前NAND的2倍,但没有达到三星官方所说的10倍可靠性。 三星前不久发布了新一代的850 Pro固态硬盘…

美版三星s7 g930 p版刷官方国际版安卓8以及手机卡信号和关闭DM服务相关问题

看了很久没有美版单卡g930p的详细刷机教程,就随手出了一篇。首先说一下,机子是两三年前的机子了,反正好久了具体多久也记不清了,刚买来的时候是还在出note7,因为是水货美版,所以没办法跟国行的刷新走&#…

聚观早报 | 三星Q3季度营业利润暴跌;iPhone 14 Plus开始交付

今日要闻:三星Q3季度营业利润暴跌31.7%;苹果iPhone 14 Plus已经开始交付;蔚来以租赁形式进军欧洲市场;特斯拉将于年底交付百事半卡订单;法拉第未来执行董事宣布辞职 三星Q3季度营业利润暴跌31.7% 10 月 7 日消息&…

三星入职测试GSAT(global samsung aptitude test)

试题内容 GSAT(global samsung aptitude test)包含三个部分,分别为数理,推理,视觉,全部为选择题。 数理 此部分考查基本的数理能力,常见的题型基本就是初中数学的内容,需要准备一下一些几何体体积公式&a…

ES6中新增的Set/Map两种数据结构

前言 Set是一种叫做集合的数据结构,Map是一种叫做字典的数据结构🧀🧀🧀 什么是集合?什么又是字典? 集合 是由一堆无序的、相关联的、且不重复的内存结构【数学中称之为元素】组成的组合字典 是一些元素的…