C ++增加,用“?:”减少数字

时间:2012-03-15 18:28:07

标签: c++ ternary-operator

我觉得如何在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)

问题:它不起作用,如何使其发挥作用?

这不是作业..

6 个答案:

答案 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); 
    } 
}
相关问题