-1

有没有一种快速的方法来执行以下操作而无需重复i++

int i = 0;
printf("foo-%d,blah-%d,orange-%d", i++, i++, i++);

我需要用 8 对或更多对来执行此操作,并且代码看起来很糟糕..

4

3 回答 3

4

参数的评估顺序未指定。此外,您不能在没有中间序列点的情况下两次修改变量。所以改为这样做:

printf("foo-%d,blah-%d,orange-%d", i, i+1, i+2);
i+=3;
于 2012-09-26T16:42:28.440 回答
3

由于您可以拥有 8 对或更多对,我建议您使用更易读且易于扩展的版本:

std::vector<std::string> vec_values = {"foo", "blah", "orange"};
for (size_t index = 0; index < vec_values.size(); ++index)
    std::cout << vec_values[index] << "-" << index;
于 2012-09-26T16:53:51.710 回答
1

您可能会根据前缀而不是数字来考虑它:

int i = 0;
std::vector<std::string> prefixes { "foo", "bar", "baz", "ham" };

bool first = false;
for (const auto& prefix : prefixes) {
    if (!first)
        std::cout << ',';
    std::cout << prefix << '-' << i++;
    first = false;
}

如果你不能使用 C++11 range-based for,你可以完整地写出来:

for (auto prefix = prefixes.begin(); prefix != prefixes.end(); ++prefix) {
//   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    if (!first)
        std::cout << ',';
    std::cout << *prefix << '-' << i++;
    //           ~~~~~~~
    first = false;
}

或者,使用索引:

for (i = 0; i < prefixes.size(); ++i) {
//   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    if (!first)
        std::cout << ',';
    std::cout << prefixes[i] << '-' << i;
    //           ~~~~~~~~~~~           ~
    first = false;
}
于 2012-09-26T16:50:26.850 回答