关于#define中printf函数里指针地址问题(已解决)

本文探讨了C++中#define宏MIN__MY的使用,特别是在递增操作下输出的迷惑现象。通过实例解析了优先级问题和p++的执行顺序,揭示了为何在不同情况下的输出并非直观。

关于#define

原文链接:https://blog.youkuaiyun.com/lc250123/article/details/79469579

小于的情况
代码如下:

#include <stdio.h>

#define MIN__MY(a,b) ((a)<=(b)?(a):(b))
 
int main()
{
    int arry[5] = {10,2,3,4,5};
    int *p = &arry[0];
	printf("*p:%d  *p:%p\n",*p,&(*p));
	printf("--------------------\n");
	printf("*p = %d , *p = %p \n MIN = %d \n*p = %d ,*p = %p\n",*p,&(*p),MIN__MY(*p++, 11), *p,&(*p));
	//同理
	//printf("*p = %d , *p = %p \n MIN = %d \n*p = %d ,*p = %p\n",*p,&(*p),((*p++)<=(11)?(*p++):('b')), *p,&(*p));
	printf("--------------------\n");
	printf("*p:%d  *p:%p\n",*p,&(*p));
    
    return 0;
}

输出结果:

*p:10  *p:0xbff2461c
--------------------
*p = 3 , *p = 0xbff24624 
 MIN = 2 
*p = 10 ,*p = 0xbff24624
--------------------
*p:3  *p:0xbff24624

大于的情况

int main()
{
    int arry[5] = {10,2,3,4,5};
    int *p = &arry[0];
	printf("*p:%d  *p:%p\n",*p,&(*p));
	printf("--------------------\n");

	printf("*p = %d , *p = %p \n MIN = %d \n*p = %d ,*p = %p\n",*p,&(*p),MIN__MY(*p++, 9), *p,&(*p));
	printf("--------------------\n");
	printf("*p:%d  *p:%p\n",*p,&(*p));	
    return 0;
}

输出结果:

*p:10  *p:0xbffb61ec
--------------------
*p = 2 , *p = 0xbffb61f0 
 MIN = 9 
*p = 10 ,*p = 0xbffb61f0
--------------------
*p:2  *p:0xbffb61f0

思考:

MIN__MY(*p++, 10)

看到这个的时候就我想到优先级
运算符优先级查看

*与++ 同级,但从右到左(←)

但++在后,要等语句完成后再p++,所以值还是还没++的值即可以理解成*p 后地址+1

一开始没考虑到有两个a都要替换,所以没想明白小于情况的结果

关于大于情况的结果的一些细节
printf的输出是从后往前
但输出的值让我理解不了,求各位大神看看如何理解,为什么是刚开始是打印2,后面反而打印10
后面考虑到 p++ 的特点
对*p++的理解,可以看看这个博主的文章
所以打印10是
p++的p未增加之前的值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值