2016-11-26 8 views
-6

流れの問題を解決しようとしています:単一のifを使用しない条件で文を実行します。

nという整数が与えられます。
nが正の場合、 '+'を出力します。
nが負の場合は ' - 'を出力し、nがゼロの場合は
を出力します。

単一のifを使用せずにc \ C++ソリューションを作成してください!

私はこのコードを書いた:

int n; 
scanf("%d", &n); 

! n >> (sizeof(n) - 1) && printf("-") || return 0; 
n > 0 && prtintf("+") || return 0; 
printf("0"); 
retuen 0; 

をしかし、私はエラーを取得:ライン3のための「戻る」の前に期待される主な表現をし、4 は、どのように私はそれを動作させるためにこのコードを変更することができます!

p.s:? :演算子は不正行為と見なされます!

+0

この復帰を試してください。 –

+0

3値条件演算子を使用してください: '?'(0? ' - ': '0'))

+0

あなたが投稿したコードは、一番少ないとは言えません。このコードを「修正する」ために、最初にどのように動作させるのか説明しなければなりません。あなたが投稿したものからは完全には不明です。 – AnT

答えて

0

はい、いくつかの制限があります。

#include <stdio.h> 
#include <stdlib.h> 
#include <limits.h> 

// Assuming 2s-complement numbers 
// and an understanding compiler 
// Some checks omitted! 

int main(int argc, char **argv) 
{ 
    int input; 
    unsigned int itmp; 
    int size; 
    int sign, sin, sout; 
    char out[3] = { '0', '+', '-' }; 


    if (argc != 2) { 
    fprintf(stderr, "Usage: %s integer\n", argv[0]); 
    exit(EXIT_FAILURE); 
    } 
    // TODO: use strtol and check input! 
    input = atoi(argv[1]); 

    size = sizeof(int) * CHAR_BIT; 
    itmp = (unsigned int) input; 

    sin = itmp >> (size - 1); 
    sign = sin^1; 

    // now "sign" is either 0 (negative) or 1 (positive) 
    // but we need 1 (negative) and -1 (positive) 
    // 0 * -2 + 1 = 1 
    // 1 * -2 + 1 = -1 

    sign = sign * -2 + 1; 

    // Now we can do 
    // in sign out sin sout 
    // -x * 1 = -x -> 1 + 1 = 2 
    // +x * -1 = -x -> 0 + 1 = 1 
    // 0 * -1 = 0 -> 0 + 0 = 0 

    itmp = itmp * sign; 
    sout = itmp >> (size - 1); 

    sign = sin + sout; 

    printf("Input: %c\n", out[(size_t) sign]); 

    exit(EXIT_SUCCESS); 
} 

ない条件式、ifとの明示的な、またwhileまたはforとの暗黙の、またショートカット...?...:...でもありません。

0

条件演算子?:は、ここで最も簡単で最も適切な答えです。

しかし、あなたが望むなら、あなたは私が正しくあなたの元のコードの意図を解読した場合

(n < 0 && (std::cout << '-', true)) || 
    (n > 0 && (std::cout << '+', true)) || 
    (std::cout << '0', true); 
std::cout << std::endl; 
を次のように、logocal事業者の短絡特性に基づいたソリューションが見えるかもしれません

int n = -5; 
... 
const char s[] = { '-', '0', '+' }; 
std::cout << (s + 1)[(n > 0) - (n < 0)] << std::endl; 

を行うことができます

returnステートメントを式に挿入しないでください。 returnはステートメントであり、演算子ではありません。式の中でreturnを使用することはできません。

+0

私はプログラムを終了するためにexit(コード)を使うことができます。私は関数を終了したいのですが? – user3073850

+0

@ user3073850:まず、 'exit'は関数を終了しません。プログラム全体が終了します。第二に、「機能を終了させる」はどこから来たのですか?元の投稿には、「機能」や「終了」については何も言及されていません。 – AnT

+0

質問を修正しました申し訳ありません – user3073850

関連する問題