2011-05-04 45 views
0

幾天前我有一個奇怪的想法進入我的腦海,以奇怪的方式操縱if();語句。讓我們繼續簡單的代碼。作爲測試條件的C函數調用

驗證碼:

if(printf("blahblah\n");{ 
} 


我的想法:

1)對我來說,我覺得這個代碼將始終評估爲真(我的假設)因爲測試條件被函數調用所替代。



所以今天我做一本書提供的練習(只是爲了幫我更新了我學前幾天)。這是代碼。

驗證碼:

#include <stdio.h> 

int main(void) // This program would add up the value enter by user , for e.g with the 
{    //input of 20 , it will print out the sum of 1+2+3+4+5.....20. 

int count , sum , size; 

count = 0; 

sum = 0; 

    printf("Enter a value to find the sum of it from 1 : "); 
    scanf("%d" , &size); 

    while (count++ < size) 

    sum = sum + count; 

    printf("sum = %d\n" , sum); 

return 0; 
} 



通過使用第一碼我的想法,我修改了第二代碼到這一點。

#include <stdio.h> 

int main(void) 
{ 
    int count , sum , size; 

    count = 0; 

    sum = 0; 

    printf("Enter a value to find the sum of it from 1 : "); 

    while (scanf("%d" , &size) && count++ < size) 

      sum = sum + count; 

     printf("sum = %d\n" , sum); 

    return 0; 
} 

問題:

1)根據本人在第一代碼所做的假設,scanf()功能假設總是被評估爲true.That就是爲什麼第二次測試條件count++ < size是確定while語句中的語句是否將被執行的語句。

2.)但是當我運行程序時,我輸入30,但它不起作用,程序只是在我輸入後沒有做任何事情就停在那裏。

3.)我嘗試將`count ++ <大小作爲左操作數切換到測試條件,而輸入函數作爲右操作數。

4.)這樣做後,我得到的結果是不同的。當我嘗試運行程序時,程序執行第二個printf()函數聲明,並打印出sum = 0

你的幫助是非常感謝,糾正我的錯誤。我願意從中吸取教訓。

回答

8

對我來說,我認爲這段代碼總是被評估爲真(我的假設),因爲測試條件被函數調用所取代。

這是不正確的。函數(在這種情況下,printf)返回一個值(在這種情況下,一個int)。當您將它用作if語句中的條件時,該函數將被調用,並且它返回的值將成爲條件:如果它返回零,則它的計算結果爲false;如果它返回非零值,它的計算結果爲true。

if (printf("Hello, World!")) { } 

int i; 
i = printf("Hello, World!"); 
if (i) { } 

之間沒有差別(除了,當然,從在第二示例中的附加變量。)


在已修改第二個例子,每次檢查循環條件時調用scanf。你可以這樣改寫循環:

while (1) 
{ 
    int result_of_scanf; 

    result_of_scanf = scanf("%d", &size); 
    if (result_of_scanf == 0) 
     break; 

    if (count++ >= size) 
     break; 

    sum += count; 
} 

scanf不只是被調用一次;它會在循環的每次迭代中被調用。 scanf返回元素的個數,它成功地讀取,所以在這種情況下,將返回1(如果你輸入的int範圍內的有效整數)或0(如果你給任何其他輸入)。

+0

我得到你的意思,它的意思printf()函數的返回值作爲測試條件。 – caramel1995 2011-05-04 08:50:03

0

的程序似乎被卡住,但實際上它在等你輸入數字。那就是你將不得不輸入數字,直到計數等於輸入數字。

相關問題