[英]I compiled this seemingly incorrect code, but I don’t understand why
我正在Linux機器上學習C ++。 我只是嘗試使用“ int i();”來聲明一個函數,但是卻忘記了對其進行定義。 但是令我驚訝的是,該代碼可以編譯並輸出1.我感到非常困惑。 我嘗試了“ int I {};”,它仍然編譯沒有錯誤。 請幫忙解釋一下。 提前致謝。
//test1.cpp
#include <iostream>
int main(void)
{
int i{};
std::cout << i << std::endl;
return 0;
}
g++ test1.cpp
./a.out
Output is: 0
//test2.cpp
#include <iostream>
int main(void)
{
int i();
std::cout << i << std::endl;
return 0;
}
g++ test2.cpp
./a.out
Output is : 1
在第一個示例中,您定義了一個名為i
的變量,並對其進行了值初始化,對於int
來說,它意味着零初始化。
int i{}; // defines i, initialised to zero
在第二個示例中,您聲明一個名為i
的函數,該函數不帶任何參數,並返回int
:
int i(); // declares a function
當您打印此:
std::cout << i << std::endl;
i
首先轉換為bool
( i
衰減為一個函數non-nullptr指針,然后變為true
),然后將其打印為整數,這就是為什么得到1
的原因。 編譯器可以在不定義i
情況下進行此轉換(因為結果始終為true
),這就是為什么您沒有鏈接器錯誤的原因。
如果您打算調用此函數並打印結果,則需要使用i()
:
std::cout << i() << std::endl;
當然,這需要i
的定義。
在您的代碼中:
//test1.cpp #include <iostream> int main(void) { int i{}; std::cout << i << std::endl; return 0; }
您實際上並不是在未定義函數的情況下就聲明了該函數。 代碼行int i{};
在main()
function
這里是一個名為i
int
type
的variable
,您正在使用brace initializer list
來初始化變量i
,不帶任何值,並且在大多數情況下可以為0
但因compiler
而異。
//test2.cpp #include <iostream> int main(void) { int i(); std::cout << i << std::endl; return 0; }
在這種情況下,基本上是同一件事。 您位於main()
並且遵循"you can not declare-define a function within a function"
的語言規則,因此會導致對variable
進行declaration - definition
。 唯一的區別是您沒有使用brace initializer list
,而是使用了稱為值初始化的ctor
constructor
函數。 同樣,您沒有傳遞任何值給它,在您的情況下,它分配了一個任意值1
。
現在,如果您的代碼如下所示:
#include <iostream>
int i();
int main() {
std::cout << i() << '\n';
return 0;
}
由於function
i
已declared
但defined
因此將無法編譯。 但是,如果您這樣做:
#include <iostream>
// The text in quotes is not meant to be a string literal. It
// is the message of the text that represents any integer X.
int i() { return /*"some int value"*/ 1; }
int main() {
std::cout << i() << '\n';
return 0;
}
這將編譯並運行得很好,因為function
i
都已declared
和defined
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.