C ++ увеличивается, уменьшается число с "?:" - PullRequest
0 голосов
/ 15 марта 2012

Мне было бы неплохо узнать, как сделать код с "?:" В 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);
}
}

ХОРОШО! это конечно не легко. (Код выше не работает, выдает ошибку: не может преобразовать char в int)

ВОПРОС: Не работает, как заставить работать?

Это не домашняя работа ..

Ответы [ 6 ]

6 голосов
/ 15 марта 2012

Многие начинающие программисты предполагают, что троичный оператор ?: является всего лишь кратким условным оператором if, что верно во многих случаях (с точки зрения начинающих разработчиков).Но есть ограничения, и они совсем не одно и то же ..

Оцененный результат троичного оператора должен быть таким же Тип (или конвертируемым в один или другой)независимо от того, является ли проверенное утверждение истинным или ложным.


#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'
6 голосов
/ 15 марта 2012

Ваша проблема не с ++ и --. Ваша проблема - злоупотребление оператором ?:.

?: не является заменой оператора if. Это прежде всего выражение . Выражения оценивают значения, которые имеют типы. Поскольку ?: может вычислять два значения, C ++ требует, чтобы либо оба значения были одного типа, либо второе значение могло быть преобразовано в первое.

sign="minus" является выражением и имеет тип. Как и (sign=="plus"?number++:number--). Но они не того же типа . И они не конвертируемы друг в друга. Так что C ++ говорит, что ваш код не имеет смысла.

2 голосов
/ 15 марта 2012

Попробуйте это:

#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";
    }
}
1 голос
/ 15 марта 2012

Не совсем так, как вы собираетесь использовать троичный оператор ...

#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) << ' ';
}
0 голосов
/ 16 марта 2012

Как уже говорили другие, вы злоупотребляете оператором ?:.Но что еще хуже, если вы замените его использование эквивалентными 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); 
    } 
}
0 голосов
/ 15 марта 2012

Проблема здесь:

number==100 ? (sign="minus") : ( sign=="plus" ? number++ : number-- ) ;

и это потому, что, если выражение, к которому относится условное выражение, не используется, второе выражение будет преобразовано в тип первого (или наоборот).

Тип первого выражения: std::string. Второй оценивается в int. Компилятор пытается повысить int до string, и это, очевидно, не удается.

Если вы настаиваете на том, чтобы сохранить его таким, вы можете немного взломать его:

number==100 ? (sign="minus") : ( sign=="plus" ? (number++,"") : (number--,"") ) ;

Надеюсь, вы этого не сделаете.

Используйте if для этого.

...