c++ 为什么使用宏时在变量中添加括号更安全?int i = 0,int n = 0,int n = 1,int n = 1 i < (n); i++)[关闭]

ix0qys7i  于 2023-05-20  发布在  其他
关注(0)|答案(3)|浏览(184)

已关闭,此问题需要details or clarity。目前不接受答复。
**想改善这个问题吗?**通过editing this post添加详细信息并澄清问题。

3天前关闭。
Improve this question
我喜欢使用宏来使我的代码更快,特别是做一个从0到n的for循环。我是这样做的:

#define For(i,n) for(int i = 0; i < n; i++)

上面的代码运行良好,但我看到其他人这样做:

#define For(i,n) for(int i = 0; i < (n); i++)

唯一不同的是他们加了一个括号。我不知道他们为什么要添加(),我从编码器得到回复,它说目的是使它更安全。但是我没有得到他的进一步解释,我在网上也找不到相关的东西。
我只是尝试做嵌套循环,如果没有添加()就可以了。
当我使用宏很长一段时间的时候,我现在添加了(),它没有显示任何不同。
我对“更安全的程序”的确切含义很好奇,我想知道更多关于使用宏的风险(比如难以调试?)).

j8yoct9x

j8yoct9x1#

它们可以使用表达式n,其中运算符precedence小于<

For(i, a ? 10 : 20)

逻辑被打破了,这个w/o括号是:(i < a) ? 10 : 20,它总是为真,并导致无限循环。

ekqde3dh

ekqde3dh2#

如果你用了第一个

#define For(i,n) for(int i = 0; i < n; i++)

而且

For(i, j + 12)

你会得到

for(int i = 0; i < j + 12; i++)

对吗?可能-取决于操作符的优先级,

for(int i = 0; i < (j + 12); i++)

总是正确的

t3psigkw

t3psigkw3#

不要使用/定义此宏。宏继承自C,是许多难以理解和修复的问题的根源。
以下是此宏失败并中断不使用此宏的代码的示例:
假设你正在使用库,它有这样的东西(什么是有效的):

struct MyContainer
{
public:
    int For(ArgType x) const;
};

现在一切工作,直到在同一个翻译单元,你将包括这个库的头文件和你讨厌的宏。
突然这个宏破坏了你喜欢使用的库。
请注意,问题不在于如何使用宏(如其他答案),而在于它如何影响不相关的代码。
免责声明:这不是问题的答案(为什么需要括号),但这不适合作为评论。

相关问题