关于带参宏的一个小疑点
关于带参宏的一个小问题。
这个程序个人感觉答案应该是:
2
12
而运行结果是:
1
9
25
关于(i++*i++), *左右应该数值不一样吧?求解。
#include<stdio.h>
#define M(y) (y*y)
main()
{
int i=1;
while(i<=5)
printf("%d\n",M(i++));
}
------解决方案--------------------
应当避免在同一个表达式使用两次++,结果并不好预测。
宏尽量这样写:
------解决方案--------------------
不是好不好预测的问题,这属于“未定义行为”,是有严重问题的代码
------解决方案--------------------
对于有参数的宏,应该避免传入i++或者++i这样的表达式。
楼主不要拘泥于这种问题。几年后,你就会发现这种问题没有意义,因为我们会尽量避免这样写。
------解决方案--------------------
你的理解没有错, 编译器也是对的。 这是执行顺序不确定的代码。
------解决方案--------------------
只能作为一个题目来做做,实际开发写这种代码要挨骂
------解决方案--------------------
我只是说的委婉点,上次看到一个帖也是这种问题,被喷得很惨。。。
楼主去看置顶帖吧!
------解决方案--------------------
不要这么写,这表达式完全依赖编译器的实现,不同编译器可能有不同结果
这个程序个人感觉答案应该是:
2
12
而运行结果是:
1
9
25
关于(i++*i++), *左右应该数值不一样吧?求解。
#include<stdio.h>
#define M(y) (y*y)
main()
{
int i=1;
while(i<=5)
printf("%d\n",M(i++));
}
------解决方案--------------------
应当避免在同一个表达式使用两次++,结果并不好预测。
宏尽量这样写:
M(y) ((y)*(y))
------解决方案--------------------
不是好不好预测的问题,这属于“未定义行为”,是有严重问题的代码
------解决方案--------------------
对于有参数的宏,应该避免传入i++或者++i这样的表达式。
楼主不要拘泥于这种问题。几年后,你就会发现这种问题没有意义,因为我们会尽量避免这样写。
------解决方案--------------------
你的理解没有错, 编译器也是对的。 这是执行顺序不确定的代码。
------解决方案--------------------
只能作为一个题目来做做,实际开发写这种代码要挨骂
------解决方案--------------------
我只是说的委婉点,上次看到一个帖也是这种问题,被喷得很惨。。。
楼主去看置顶帖吧!
------解决方案--------------------
不要这么写,这表达式完全依赖编译器的实现,不同编译器可能有不同结果