2017-08-05 88 views
0
#include<stdio.h> 

void main(){ 
    char operator; 
    double a, b; 

    printf("enter an operand(+,-,*,/)"); 
    scanf("%c",&operator); 
    printf("enter two operands"); 
    scanf("%lf %lf",&a,&b); 

    switch(operator){ 
     case '+': printf("%lf is the output of a & b",(a+b)); break; 
     case '-': printf("%lf is the output of a & b",(a-b)); break; 
     case '*': printf("%lf is the output of a & b",(a*b)); break; 
     case '/': printf("%lf is the output of a & b",(a/b)); break; 
    } 
} 

我知道只有一個整數在一個case後才被允許。我也知道,在單引號內寫入的任何字符都會寫入一個ascii整數。在C語言中的switch語句中的案例

在此switch語句中的參數是一個字符, switch(operator);

這將如何與案例中的整數等同? case '+':

+0

_Characters_是整數。對於ASCII,''+''具有整數值43. – chux

回答

0

char僅僅是8位(大部分)整數

所以case '+':to case 43:作爲43的等效的 '+'

+0

這就是我的問題所在,我們如何將一個字符,即開關內部的orerator參數等同於'+' –

+0

'開關(運算符)' - 如果'operator'是43 - 'case'+':'將被選中。兩者都是整數類型。 –

3

條件在switch語句來需求的ASCII碼不是完全鍵入int,而是「整型(char,signed或unsigned integer或枚舉)」的任何表達式(例如,參見switch statement documentation at cppreference)。因此,使用char類型的變量operator作爲switch中的條件即可。

將每個case:標籤中的常量表達式轉換爲提升的表達式類型(在您的案例中爲char),然後將評估條件的結果與表達式的(轉換後的)值進行比較。因此類型char的常量表達式如'+','-'也是可以的。

最後,病症的提升的類型是char,在你case: -statements每個常數爲char類型的,並且因此charchar比較。

請注意,常量'+'的char-「value」是它的8位ASCII值,即43。此外,如果一個用scanf("%c",&operator)當進入在控制檯+,所述的operator「值」將是+ 8位ASCII值,也即43。在這種情況下,開關語句將比較8位43與8位43 ...

希望它有幫助。

+0

從C++站點引用C語言問題的幫助有限。 'Contextically implicitly convertible'與C標準中的措辭或規範沒有遠程相關! –

+1

當然這在C編譯?我得到的錯誤是「錯誤:案例標籤不減少到一個整數常量」 – chux

+0

@Jonathan Leffler:對,謝謝。在回答我轉向C++的問題的同時,仍然在C環境中編寫和測試代碼。真棒。 –