gpt4 book ai didi

c++ - 某些宏语句在 C++ 中可能会产生意想不到的结果?

转载 作者:太空狗 更新时间:2023-10-29 23:24:59 24 4
gpt4 key购买 nike

哪个宏语句可能会导致意想不到的结果?

#define YEAR_LENGTH   365
#define MONTH_LENGTH 30
#define DAYCALC(y, m, d) ((y * YEAR_LENGTH) + (m * MONTH_LENGTH) + d)

int main()
{
int x = 5, y = 4 , z = 1;
cout << DAYCALC(x *3 , y %3 , z) << endl ;
cout << DAYCALC(x +12 , y , 300) << endl ;
cout << DAYCALC(x , 40 - y , 3+z) << endl ;
cout << DAYCALC(x , y , (z+50)) << endl ;
cout << DAYCALC(x , y %3 , z) << endl ;
cout << DAYCALC(4 % x , y++ , z) << endl;
return 0;
}

我运行该程序非常好,没有任何意外结果。

是否有一些隐藏的异常?

最佳答案

您遇到了运算符优先级问题。宏按字面意义扩展为文本复制和粘贴。

例如:

DAYCALC(x , 40 - y , 3+z)

扩展为:

((40 - y * YEAR_LENGTH) + (x * MONTH_LENGTH) + 3+z)

请注意,40 - y * YEAR_LENGTH 不是您想要的,因为运算符优先。

因此您需要在宏中将参数放在 () 中:

#define DAYCALC(y, m, d)     (((y) * YEAR_LENGTH) + ((m) * MONTH_LENGTH) + (d))

一般来说,如果一个宏参数在宏中出现不止一次,像y++这样的副作用(在你最后的语句中)也会应用不止一次。所以这是要小心的事情。

关于c++ - 某些宏语句在 C++ 中可能会产生意想不到的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8108708/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com