我觉得如何在C ++中使用“?:”创建一个代码,首先增加数量,当它达到100时,它会减少,当它达到0时,它会再次增加。
好的澄清一下:起始编号:1,应写入1 - 100,然后写入100,100,99,98,97至0,依此类推。
#include <iostream>
using namespace std;
int main () {
int number = 1;
string sign = "plus";
for (int i = 700; i > 0; i--) {
(number==0?sign="plus":(number==100?sign="minus":(sign=="plus"?number++:number--)));
cout << number;
usleep(3000);
}
}
WELL!这当然不容易。 (上面的代码不起作用,给出错误:无法将char转换为int)
问题:它不起作用,如何使其发挥作用?
这不是作业..
答案 0 :(得分:6)
问题不在于++
和--
。您的问题是您滥用?:
运营商。
?:
不能替代if
语句。它首先是表达式。表达式评估具有类型的值。由于?:
可以计算为两个值,因此C ++要求两个值都是相同的类型,或者第二个值可以转换为第一个值。
sign="minus"
是一个表达式,它有一个类型。和(sign=="plus"?number++:number--)
一样。但它们不是相同的类型。而且他们不能相互转换。所以C ++说你的代码没有意义。
答案 1 :(得分:6)
许多新手程序员假设三元运算符?:
只是一个简短的if语句,在许多情况下都是如此(从新手开发人员的角度来看)。但是有一些限制,它们完全没有相同的东西。
无论测试的语句是真还是假,三元运算符的计算结果必须与 Type 相同(或可转换为其中一个)。
#include <string>
int
main (int argc, char *argv)
{
std::string s;
0 == 0 ? s = "123": 123;
}
在这个自包含的示例中(无法编译以轻松证明我的观点),我们得到以下错误;
foo.cpp: In function 'int main(int, char**)':
foo.cpp:7:23: error: no match for ternary 'operator?:' in 'true ? s.std::basic_string<_CharT, _Traits, _Alloc>::operator=<char, std::char_traits<char>, std::allocator<char> >(((const char*)"123")) : 123'
这是因为如果语句为真,表达式将评估为std::string&
,如果语句为假,则表达式将评估为int
。两种不同的类型取决于评估的表达式是否真实? 不允许。
编译器因此尝试隐式转换任何一方以便找到匹配,但是找不到任何合适的转换,我们就会在我们面前抛出错误。
int
main (int argc, char *argv[])
{
0 == 0 ? "123": 123;
}
上面的代码片段会产生比我们之前更好的编译错误(当试图编译它时g++
)。如本文所述; ?:
的两个结果操作数都必须属于同一类型。
foo.cpp: In function 'int main(int, char**)':
foo.cpp:4:19: error: operands to ?: have different types 'const char*' and 'int'
答案 2 :(得分:2)
试试这个:
#include <iostream>
int main(int argc, char **argv) {
int number = 1;
int direction = +1;
for (int i = 700; i > 0; i --) {
direction = direction > 0
? (number < 100 ? +1 : -1)
: (number > 0 ? -1 : +1);
number += direction;
std::cout << number << "\n";
}
}
答案 3 :(得分:1)
不像你想要的那样使用三元运算符...
#include <iostream>
int main() {
for(int i=0;i<700;++i)
std::cout << (i/100%2?99-i%100:i%100+1) << ' ';
}
根本不使用它:
int main() {
for(int i=0;i<700;++i)
std::cout << abs((i+101)%200-100) << ' ';
}
答案 4 :(得分:0)
问题在于:
number==100 ? (sign="minus") : ( sign=="plus" ? number++ : number-- ) ;
这是因为,如果未使用条件求值的表达式,则第二个语句将被提升为第一个类型(或者相反)。
第一个表达式的类型是std::string
。第二个评估为int
。编译器尝试将int
提升为string
,但显然会失败。
如果你坚持这样做,你可以稍微破解它:
number==100 ? (sign="minus") : ( sign=="plus" ? (number++,"") : (number--,"") ) ;
我希望你不要。
if
。答案 5 :(得分:0)
正如其他人告诉你的那样,你正在滥用?:
运营商。但更糟糕的是,如果你用等效的if
语句替换它的使用,你会发现你也有逻辑错误:
#include <iostream>
using namespace std;
int main () {
int number = 1;
string sign = "plus";
for (int i = 700; i > 0; i--) {
if (number==0) // <-- never happens!
sign="plus";
else {
if (number==100) // <-- when number reaches 100, it stops being updated!
sign="minus";
else {
if (sign=="plus")
number++;
else
number--;
}
}
cout << number; // <-- counts to 100 and then keeps outputting 100
usleep(3000);
}
}
要解决此问题,您需要的逻辑更像是以下内容:
#include <iostream>
using namespace std;
int main () {
int number = 1;
string sign = "plus";
for (int i = 700; i > 0; i--) {
cout << number;
if (number==0)
sign="plus";
else if (number==100)
sign="minus";
if (sign=="plus")
number++;
else
number--;
usleep(3000);
}
}