2014-09-03 102 views
1

我的教授發佈差異返回1

int main(int argc, char **argv) 
{ 
    // enter code here 

    printf("Test 1: trying odd(3) AND even(2)...\n"); 
    printf("%d\n", odd(3) && even(2)); 
    printf("Test 2: trying odd(3) OR even(2)...\n"); 
    printf("%d\n", odd(3) || even(2)); 
    printf("Test 3: trying odd(4) AND even(7)...\n"); 
    printf("%d\n", odd(4) && even(7)); 
    printf("Test 4: trying odd(4) OR even(7)...\n"); 
    printf("%d\n", odd(4) || even(7)); 

    return 0; 
} 

int odd(int n) 
{ 
    printf("in odd!\n"); 

    return n % 2 == 1; 
} 

int even(int r) 
{ 
    printf("in even!\n"); 

    return r % 2 == 0; 
} 

作爲賦值問爲什麼線2和3只在奇數回報!但1和4在奇數中返回!甚至在!我不確定爲什麼,因爲我不知道返回1和返回0命令之間的區別。從我能收集的內容中返回1將始終返回值(在本例中爲奇數!),但返回0只會在它滿足特定條件時才返回它?

另請參見:代碼int length(char * name,int start,double finish):以字符作爲實數返回單詞的長度?

在此先感謝任何決定幫助我的人。

+1

我已修復您的代碼indendantion。您必須使用4個字符間距縮進代碼,或者選擇所有代碼,然後單擊「代碼示例」按鈕。 – pablo1977 2014-09-03 03:46:27

+0

感謝您的幫助! – NewCsStudent432 2014-09-03 03:47:07

+2

@ pablo1977你稱之爲修復? – 2014-09-03 03:47:11

回答

3

這被稱爲「Short-circuit evaluation」。

...在第二個參數被執行或評估僅在第一個參數不足以確定表達式的值...

因此,你必須弄清楚什麼將這兩個函數oddeven返回:

  1. 奇數():如果n%2 == 1,返回1,否則返回0
  2. 甚至():如果n%2 == 0,返回1,否則爲0

而在main()函數,

  1. odd(3)ANDodd(3)返回1,並檢查返回值,因此even()被調用。
  2. odd(3)ORodd(3)返回1,因爲「短路求」的,它並不需要檢查,因此even()不叫。
  3. odd(4)even(7)odd(4)返回0,因爲「短路求」的,它並不需要檢查even(7),因此even()不叫。
  4. odd(4)OReven(7)odd(4)返回0,並檢查even(7)的返回值,因此even()被調用。
2

當評估一個邏輯表達式時,它會逐個檢查條件,並且只要知道整個表達式(不管剩下的是什麼),就會停止對它們進行評估。

unsigned char a = 1; // true 
unsigned char b = 0; // false 

殼體1

if (a && b) printf("Yes"); 
  • 檢查a:是的,它是true
  • 檢查b:沒有它不是true

結果:表達是錯誤的,它不打印Yes

殼體2

if (a && !b) printf("Yes"); 
  • 檢查a:是的,它是true
  • 檢查b:是它是false

結果:表達是正確的,它打印Yes

殼體3

if (a || b) printf("Yes"); 
  • 檢查a:是的,它是true
  • 檢查b !!!爲什麼?不需要檢查b,因爲只有通過檢查a才能知道整個表達結果,你同意嗎?

結果:檢查a和打印Yes甚至沒有檢查b

項目,您的代碼現在;)

1

邏輯布爾代數運算符AND和OR(&&|| c)中與操作一種稱爲short-circuit evaluation的優化。

這是優化的工作原理。

試想一下,你想出了自己的規則:

,如果他們擁有cat和A dog和A fish你只會某人約會。

現在想象一下,你開始跟某個你可能有興趣約會的人談話。他們說:

那麼,我有一隻貓,我沒有一條魚,但我確實有一條狗。

你什麼時候停止關注他們說的話?只要他們說他們沒有fish,因爲一旦他們說,他們打破了你的「AND」規則。所以,這句話的其餘部分完全不相關。這是短路和。

現在,假設你改變了你的規則:

你只能約會的人,如果他們擁有一個catdogfish

現在想象一下,你開始跟某個你可能有興趣約會的人談話。他們說:

嗯,我沒有一隻貓,我有一條魚,我沒有一隻狗。

你什麼時候停止關注他們說的話?只要他們說他們有一個fish,因爲他們一說,他們滿足你的「OR」規則。所以,這句話的其餘部分完全不相關。這是短路或。

短路評估是評估邏輯表達式的性能優化。

在您的例子中,even()函數返回true如果傳遞給它的數量是偶數,並且odd()函數返回true如果傳遞給它的數量是偶數。否則這些功能返回false。查看每個布爾表達式,並注意何時必須進行短路評估。

1

返回0; - 函數返回0. 返回1; - 函數返回1.

在你的情況下,奇數函數在number(n)是奇數時返回1,當number是偶數時返回0。 這是通過「詢問」如果提醒時除以2等分1來完成的。

甚至函數在數字(r)是偶數時返回1,當數字是奇數時偶數函數返回0。 這是通過「問」如果2 equels 0

劃分提醒時,在你的主要功能,以及(& &)和或邏輯運算完成後,對奇數和偶數的返回值的結果進行功能。例如:奇數(3)返回1,偶數(2)返回1然後1 & & 1等於1(結果)。

0

還有另一種方法來測試整數類型的偶數值。

int IsOdd(int x) { return (x & 1); } 
int IsEven(int x) { return !(x & 1); } 

如果設置了最低有效位,則該數字爲奇數。如果不是,那甚至是。這只是測試那一點。只要把它扔到那裏,你就可以消除模數運算......這是另一種選擇。不是你的問題的答案,但我不能評論,所以...

0

正如我們所知0表示錯誤,1表示真實性。返回部分告訴編譯器該函數必須將評估結果返回給調用者模塊。

所以,返回1裝置發送關於所調用的模塊的成功執行呼叫者模塊(具有非零量的助劑,即1) 而,

返回0呈現顯示的標誌,有是導致被叫模塊終止的一些錯誤/異常。因此,在這種情況下,應該使用stderr來提供有關這種錯誤的詳細信息。