关于#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未增加之前的值
本文探讨了C++中#define宏MIN__MY的使用,特别是在递增操作下输出的迷惑现象。通过实例解析了优先级问题和p++的执行顺序,揭示了为何在不同情况下的输出并非直观。
5665

被折叠的 条评论
为什么被折叠?



