循环增量/减量值的更改



考虑以下代码:

# include <iostream>
using namespace std;
int main()
{
for(int i = 5; i>0;)
{
i--;
cout <<i<<" ";
}
return 0;
}

该代码的输出将是4 3 2 1 0

我可以更改递减/递增值吗?

详细地说,这意味着默认的递减/递增值为1。所以你要么减1,要么加1。

我可以把它改成-0.2还是加1.3?


如果是,是否有方法告诉编译器,我想将--值从1更改为0.2,并且仍然使用--运算符,而不是将其更改为-=0.2

d--d -= 1的简写,也是d = d - 1的简写。你不应该把它理解为一个数学方程,而应该把它解读为";计算CCD_ 7并将结果分配为CCD_;。

#include <iostream>
int main()
{
float day = 1.2;
for(int i = 0; i < 5; i++)
{
day -= 0.2;
std::cout << day;
}
return 0;
}

(我也删除了using namespace std,因为这是不好的做法)。

注意for循环的第二部分是保持循环进行的条件,只要它为真。在您的情况下,i > 5从一开始就是false(因为0 < 5),所以循环永远不会运行。我以为你指的是i < 5

i--是修复后递减运算符。对于内置类型,这意味着i递减一(1)。表达式i--的值是i在递减之前的值

--i是预固定递减运算符。对于内置类型,这意味着i递减一(1)。表达式--i的值是i在将其递减之后的值

对于内置类型,不能更改递增或递减运算符的行为。如果你想有另一种行为,你需要回退到操作符+=-=,在那里你可以添加你想要的任何内容。但请注意,您的代码使用了int,在添加或减去0.10.2之前,您可能需要先更改为floatdouble

不过,您可以为自己的类型更改递增和递减运算符的行为。这是一个示例

#include <iostream>
struct S {
S& operator++() { // prefix increment "++s"
d += increment_value;
return *this;
}
S& operator--() { // prefix decrement "--s"
d -= decrement_value;
return *this;
}
S operator++(int) { // postfix increment "s++"
S copy{*this};
d += increment_value;
return copy;
}
S operator--(int) { // postfix decrement "s--"
S copy{*this};
d -= decrement_value;
return copy;
}
double d{};
double increment_value{0.2};
double decrement_value{0.1};
friend std::ostream& operator<<(std::ostream& os, const S& s) {
os << s.d;
return os;
}
};
int main(int, char**) {
S s{1};
std::cout << "val=" << s.d << 'n';
std::cout << "prefix++=" << ++s << 'n';
;
std::cout << "val=" << s.d << 'n';
std::cout << "postfix++=" << s++ << 'n';
std::cout << "val=" << s.d << 'n';
std::cout << "prefix--=" << --s << 'n';
std::cout << "val=" << s.d << 'n';
std::cout << "postfix--=" << s-- << 'n';
std::cout << "val=" << s.d << 'n';
}

输出为

val=1
前缀++=1.2
val=1.2
val=1.4
前缀--=1.3
val=1.3
后缀--=1.3
val=1.2

您可能会注意到,我添加了两个operator ++和两个operator--。其中一个没有得到任何参数,另一个得到一个int。正如cpprreference所描述的,int参数只是一个伪参数,用于区分运算符的前缀和后缀版本。(*)

您还可以看到,前缀运算符的性能更高,因为它们不需要额外的副本。因此,通常请使用前缀版本(比较CppCoreGuidelines)。

但是,请忽略更改递增和递减运算符的可能性。这是违反直觉的,只是错误和头痛的根源。不要这样做

(*)这个参数也可以用于更令人困惑的行为,但应该清楚的是,这会让这个想法变得更糟。所以,把这看作是技术上可行的一个例子。

#include <iostream>
struct S {
S operator++(int diff) { // postfix increment "s++", diff defaults to zero (0)
S copy{*this};
d += diff ? diff : increment_value;
return copy;
}
S operator--(int diff) { // postfix decrement "s--", diff defaults to zero (0)
S copy{*this};
d -= diff ? diff : decrement_value;
return copy;
}
double d{};
double increment_value{0.2};
double decrement_value{0.1};
friend std::ostream& operator<<(std::ostream& os, const S& s) {
os << s.d;
return os;
}
};
int main(int, char**) {
S s{1};
std::cout << "val=" << s.d << 'n';
s++;
std::cout << "val=" << s.d << 'n';
s.operator++(2);
std::cout << "val=" << s.d << 'n';
s--;
std::cout << "val=" << s.d << 'n';
s.operator--(2);
std::cout << "val=" << s.d << 'n';
}

中的结果

val=1
val=1.2
val=3.1
val=1.1

您可以随心所欲地更改for和body内部的循环变量。例如:

for (double d = 4; d > 0; d = cos(d) + 1 / d) {
d = sin(d);
std::cout << d << " ";
}

C++不像其他语言CCD_ 33那样具有固定计数循环,其中CCD_。做你喜欢做的事。

注意:由于您询问了按0.2递减的问题,所以我将类型更改为double。类型int不允许这样做。

我可以更改递减/递增值吗?

是的,这就是for循环中的第三个参数(?)的作用。

#include <iostream>
int main()
{

for(int i = 5; i > 0; i -= 2)
{
std::cout << i << std::endl;
}
return 0;
}

我可以把它改为-0.2还是加1.3?

是的,您只需将第一个参数更改为浮点,将第三个参数更改为由您想要的任何值递减/递增。

#include <iostream>

int main()
{
for (float i = 5; i > 0; i -= .2)
{
std::cout << i << std::endl;
}
return 0;
}

如果我理解正确,您想做的就是更改T operator --();的行为
您可以使用自己的类型:

struct Foo {
float boat;
auto operator --() noexcept { return boat -= .2f; }
operator float() const noexcept { return boat; }
};
#include <cstdio>
int main() {
for (Foo i{ 5 }; i > 0; --i) {
std::printf("%1.2f, ", static_cast<float> (i));
}
}

实时编译器资源管理器
您应该这样做吗?不,你不应该。但现在你知道了,如果机会不来,该怎么做。

最新更新