条件运算符不允许程序终止
The conditional operator is not allowing the program to terminate
我刚刚了解了条件运算符,并且正在做一个介绍性练习:
Write a program to use a conditional operator to find the elements in
a vector<int>
that have odd value and double the value of each such
element.
这是我写的代码:
int main()
{
vector<int> nums = { 1,2,3,4,5,6,7,8,9 };
int i;
auto beg = nums.begin();
while (*beg > 0) // This will always evaluate to true.
{
((*beg) % 2 == 0 && (beg < nums.end()) ? i = 0 : *beg = 2 * (*(beg++)));
/*If the number is even the program will just assign 0 to i*/
}
}
如果您将最后一行更改为:
,程序将终止并为您提供正确的输出
((*beg)%2 == 0 && (beg < nums.end()) ? i = 0 : *beg = 2*(*(beg)));
++beg;
为什么会这样?
它卡住了,因为如果条件 ((*beg)%2 == 0 && (beg < nums.end())
是 true
,迭代器将不会递增以进一步检查。您只有设置 i=0
。您也应该增加迭代器。
你可以使用 comma operator :
while (beg != nums.end() && *beg > 0)
{
(*beg) % 2 == 0 ? (beg++, i): (*beg = 2 * (*beg) , beg++, ++i );
}
还要注意计数 i
应该预先初始化,而不是在 while
循环中。
根据要求的完整工作代码为:
#include <iostream>
#include <vector>
int main()
{
std::vector<int> nums = { 1,2,3,4,5,6,7,8,9 };
int i{0};
auto beg = nums.begin();
while (beg != nums.end() && *beg > 0)
{
(*beg) % 2 == 0 ? (beg++, i): (*beg = 2 * (*beg) , beg++, ++i );
}
for (const int ele : nums)
std::cout << ele << " ";
std::cout << "\ncount: " << i << "\n";
}
输出:
2 2 6 4 10 6 14 8 18
count: 5
也就是说,IMO 像上面那样使用逗号运算符和条件运算符(任务)并不是一种好的编码方式,这只会让你的代码库的未来读者感到困惑。
另请阅读:Why is "using namespace std;" considered bad practice?
如果您想将某些值加倍而不是其他值,就这样做:
#include <iostream>
#include <vector>
int main() {
std::vector<int> nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
for (int& num : nums)
num = num % 2 ? 2 * num : num;
for (int num : nums)
std::cout << num << ' ';
std::cout << '\n';
return 0;
}
条件表达式是一个表达式;你用它来计算一个值。问题中的代码不会那样做;它使用条件表达式作为选择副作用的方式,最好用普通的 if
语句来完成。
我刚刚了解了条件运算符,并且正在做一个介绍性练习:
Write a program to use a conditional operator to find the elements in a
vector<int>
that have odd value and double the value of each such element.
这是我写的代码:
int main()
{
vector<int> nums = { 1,2,3,4,5,6,7,8,9 };
int i;
auto beg = nums.begin();
while (*beg > 0) // This will always evaluate to true.
{
((*beg) % 2 == 0 && (beg < nums.end()) ? i = 0 : *beg = 2 * (*(beg++)));
/*If the number is even the program will just assign 0 to i*/
}
}
如果您将最后一行更改为:
,程序将终止并为您提供正确的输出((*beg)%2 == 0 && (beg < nums.end()) ? i = 0 : *beg = 2*(*(beg)));
++beg;
为什么会这样?
它卡住了,因为如果条件 ((*beg)%2 == 0 && (beg < nums.end())
是 true
,迭代器将不会递增以进一步检查。您只有设置 i=0
。您也应该增加迭代器。
你可以使用 comma operator :
while (beg != nums.end() && *beg > 0)
{
(*beg) % 2 == 0 ? (beg++, i): (*beg = 2 * (*beg) , beg++, ++i );
}
还要注意计数 i
应该预先初始化,而不是在 while
循环中。
根据要求的完整工作代码为:
#include <iostream>
#include <vector>
int main()
{
std::vector<int> nums = { 1,2,3,4,5,6,7,8,9 };
int i{0};
auto beg = nums.begin();
while (beg != nums.end() && *beg > 0)
{
(*beg) % 2 == 0 ? (beg++, i): (*beg = 2 * (*beg) , beg++, ++i );
}
for (const int ele : nums)
std::cout << ele << " ";
std::cout << "\ncount: " << i << "\n";
}
输出:
2 2 6 4 10 6 14 8 18
count: 5
也就是说,IMO 像上面那样使用逗号运算符和条件运算符(任务)并不是一种好的编码方式,这只会让你的代码库的未来读者感到困惑。
另请阅读:Why is "using namespace std;" considered bad practice?
如果您想将某些值加倍而不是其他值,就这样做:
#include <iostream>
#include <vector>
int main() {
std::vector<int> nums = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
for (int& num : nums)
num = num % 2 ? 2 * num : num;
for (int num : nums)
std::cout << num << ' ';
std::cout << '\n';
return 0;
}
条件表达式是一个表达式;你用它来计算一个值。问题中的代码不会那样做;它使用条件表达式作为选择副作用的方式,最好用普通的 if
语句来完成。