[英]How does initializing a variable before passing statement arguments affect the output?
#include <stdio.h>
int main()
{
int a, b, sum;
sum = a + b; // initializing variable "sum" here gives incorrect answer to a+b
printf("Enter value a: ");
scanf("%d", &a);
printf("Enter value b: ");
scanf("%d", &b);
printf("sum of %d + %d = %d\n\n", a, b, c);
return 0;
}
這是一個應該將兩個整數相加的程序。 我注意到,在我在打印和掃描語句中傳遞任何參數之前初始化變量“ sum”時,我的輸出不是變量“ a”和“ b”的正確總和。 但是,當我在打印和掃描語句之后初始化變量“ sum”時,輸出是正確的:
#include <stdio.h>
int main()
{
int a, b, sum;
printf("Enter value a: ");
scanf("%d", &a);
printf("Enter value b: ");
scanf("%d", &b);
sum = a + b; // variable "sum" is initialized after statement arguments
printf("sum of %d + %d = %d\n\n", a, b, c);
return 0;
}
所以我的問題是:
首先,從未聲明變量“ c”,並且編譯器給出了錯誤。 修改您的代碼。
至於'sum'變量:問題不在於初始化,而在於評估。 在C語言中,表達式評估的順序稱為“ 應用性 ”順序,這意味着所有內部表達式必須在外部表達式之前進行評估。
在您的情況下,訂單者是:我們需要為“ sum”分配一個值,因此必須對其進行評估! 調用加法運算符('+')。 但是還有兩個變量“ a”和“ b”。 但是,它們沒有存儲任何值。 它們尚未初始化 ! 從未初始化的變量中獲取數據的意圖的結果是未知的(稱為未定義行為 )。
如果在賦值表達式調用之前 將數據讀取到'a'和'b'變量,則相同的求值結果將得出正確的答案 ,因為'a'和'b'存儲了一些已定義的數字。
所以...用C編寫時,您應始終牢記評估順序是適用的。 如果您開始玩副作用,那非常重要。 同樣,功能參數的評估順序是不確定的。
在您的第一個代碼中,您剛剛聲明了int變量a和b且未使用任何特定值對其進行初始化,因此它們基本上包含Garbage值,然后立即將它們添加到sum變量中,該變量現在將包含Garbage值。 在此之后,您將輸入a和b,但是將它們添加到sum變量中,因此sum具有垃圾值,並且帶來了未聲明的新變量c,這將在編譯時引發錯誤
在您的第二代碼中,您聲明了a和b,然后對其進行了掃描,然后將輸入值放入a和b中,並將這些新值相加,然后求和,但仍打印未聲明的c值。 如果你寫
printf("sum of %d + %d = %d\n\n",a,b,sum);
代替
printf("sum of %d + %d = %d\n\n",a,b,c);
您現在可以看到輸出。 第一個代碼打印垃圾值,第二個代碼打印實際值
為什么在語句參數之后需要初始化變量?
如果默認情況下不使用特定值初始化它們,則它們將保留一些垃圾值,並且對垃圾值進行操作是無用的。此外,在何處初始化它們也無關緊要,這取決於代碼的功能。 我也可以這樣做,因為int a = 5; 在聲明之前。 為了避免這種情況,您可以在聲明它們時初始化它們,或者接受輸入並為其賦值,這樣它們就不會保留垃圾值。
變量聲明和初始化的順序背后的實際邏輯是什么?
以上解釋說明了自己。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.