在使用cout时,如果语句为cout<<E1<<E2<<E3;,则不能保证E1、E2和E3的执行顺序与它们编写的顺序相同。
我可以做什么来确保它们以相同的顺序执行,而不是在它们之间编写另一个cout语句或endl?
发布于 2020-04-25 03:35:43
我不确定这是不是最好的决定(或者至少是一个好决定),但你可以使用Boost.Preprocessor:
#include <boost/preprocessor/seq/for_each.hpp>
#include <boost/preprocessor/variadic/to_seq.hpp>
#define COUT_IMPL(_, __, i) \
std::cout << (i);
#define COUT(...) \
BOOST_PP_SEQ_FOR_EACH( \
COUT_IMPL, \
_, \
BOOST_PP_VARIADIC_TO_SEQ(__VA_ARGS__) \
);
void use() {
COUT(e1, e2, e3);
} 这使得C预处理器可以为您创建;-terminated cout,从而提供有保证的计算顺序。
发布于 2020-04-25 03:56:05
除非重新定义<<运算符,否则将按编写的顺序执行。这个
cout << E1 首先使用std::ostream返回类型执行(当然,除非我们使用不同的cout类型玩游戏。cout不是C++关键字或保留字)。这个副作用的cout被传递给下一个表达式:
cout << E2对下一个参数重复该过程。我没有注意到运算符优先级的任何C++更改。我想不出任何方法来使用C预处理器,或者使用其他真正晦涩难懂的重载技术,在这些技术中,您可能能够执行一些非典型操作。
https://stackoverflow.com/questions/61414773
复制相似问题