2017-09-09 5 views
1

私はjuiceという名前の関数を作成しました。顧客は のジュースのカップサイズを選択して価格や支払い金額を返しますが、私はそれが0を返す必要がありますswitchステートメントのデフォルトケースを選択するが、出力は2なぜ "Payable 0"であるべきか "Payable 2"を印刷する理由

#include <stdio.h> 

int juice(char size , int qty){ 
int price =0; 
switch(size){ 
    //'s' for small size of cup 
    case 's': 
     printf("size small"); 
     price =20*qty; 
     return price; 
     break; 
    //'m' for medium size of cup 
    case 'm': 
     printf("size medium"); 
     price =30*qty; 
     return price; 
     break; 
    //'l' for large size of cup 
    case 'l': 
     printf("size large"); 
     price =40*qty; 
     return price; 
     break; 
    //if costumer choose wrong size 
    default: 
     printf("choose proper size"); 
    } 

printf("\n%d", price); 
} 

int main() 
{ 
    int price =juice('d' ,5); 
    printf("\npayable is %i\n", price); 
    return 0; 
} 

出力です:

choose proper size 
0 
payble is 2 
+0

'size'が有効な選択肢でないときは、何も返しません。つまり、' price'はおそらくガベージ値になります。関数の最後に明示的に '0'を返します。 (そして、あなたが 'return'の後にスイッチからブレークアウトする必要はありません - あなたが関数から戻ってきたので、' break'に到達することはできません。) –

答えて

3

問題は、機能がdefault場合には戻っていないということです。それは未定義の動作です。

return price;ことは、次のbreak;が不要になり、それはまた、代わりに、読むためのコード難しくなり、以来、あなたはあなただけでreturn price;を置くことができます(defaultを除く)すべてのケースでpriceの値を設定しています終わり。最後に、defaultケースに初期化文を追加します。また、この

int juice(char size, int qty) 
{ 
    int price = 0; 
    switch (size) { 
     case 's': // 's' for small size of cup 
      printf("size small\n"); 
      price = 20 * qty; 
      break; 
     case 'm': // 'm' for medium size of cup 
      printf("size medium\n"); 
      price = 30 * qty; 
      break; 
     case 'l': // 'l' for large size of cup 
      printf("size large\n"); 
      price = 40 * qty; 
      break; 
     default: // if costumer choose wrong size 
      printf("choose proper size\n"); 
      price = -1; // Invalid value? 
      break; 
    } 
    return price; 
} 

、改行文字'\n'よう

何かがそれはストリームをフラッシュし、新しい行を作成しますので、IOストリームがラインバッファリングされている行の最後に置かれることを意図されており、それを最後に置く方が理にかなっています。

+0

しかし、私はガベージ値が同じであってはならないと思います私がコンパイルするたびに、それがあります。 – meditat

+0

@ ShivamSingh:未定義の動作についての素晴らしい点は、要求された結果が定義されていないため、コードがまだ間違っていて、結果がまだ正しいことです。 –

+0

@ ShivamSingh、それは誰も理解できないと思われる*未定義のものです。原則として予測可能ですが、コード自体からは予測できません。コンピュータプログラムは決定論的なので、生成されたプログラムに影響を及ぼすものを変更しない限り、変更されません。 –

関連する問題