[英]A beginner's hello world C program?
作為初學者,我在 Code::Blocks 上輸入了以下 hello world 程序 -
#include<stdio.h>
main()
{
printf("Hello world \n");
}
現在,我單擊“構建並運行”,輸出屏幕顯示“Hello world”。
但是,我正在閱讀的書建議我刪除程序的某些元素,以查看程序中發生的錯誤。
我做了 2 處更改。 首先,我從程序中刪除了 \n。 (這本書告訴我,沒有\n,運行程序會出錯)但是,當我單擊“構建並運行”時,輸出屏幕給我的輸出與沒有任何錯誤時的輸出相同。
我所做的第二個更改是從程序中刪除#include。 即使是現在,輸出屏幕仍顯示與沒有錯誤時相同的輸出。
為什么會這樣? 請告訴我如何解決這個問題?
我使用的編譯器是 GNU GCC 編譯器。
編輯:按照建議,我添加了 -wall、-wextra、-pedantic。 現在,當我單擊“構建並運行”時,它顯示找不到 -1-wall、-1-wextra 和 -1-pedantic,並且程序無法運行。 現在如何解決這個問題?
案例1:你的書錯了。 刪除\n
永遠不會引發任何錯誤。 \n
表示換行符,它將在Hello World之后打印一個新行。
情況 2:可能是您沒有再次構建代碼,因為如果不包含stdio
(表示標准輸入/輸出),如果您使用較新的 C 標准(C99、C11),您可能不會調用printf()
函數。 閱讀更多關於stdio.h的信息。
請注意,在 C99 之前的標准中,如果您刪除原型 ( #include <stdio.h>
),C 將自動為函數提供隱式聲明。 看起來像這樣:
int printf();
意味着,它將接受任意數量的參數並返回int
。 但在 C99 中,隱式減速被移除。 所以很可能你的編譯器不會面對 C99。
看看這里,編譯好!
閱讀更多關於c 中的隱式聲明。
編輯:正如評論中提到的 AnT,刪除#include<stdio.h>
,對 printf 的調用將在 C99 之前的語言版本中“編譯”。 但是,調用將產生未定義的行為。 即使在 C89/90 中,也必須在調用之前使用原型聲明可變參數函數(如 printf)。 否則,行為未定義。
您的程序已經包含錯誤。 現代 C 中的函數必須用明確指定的返回類型聲明。 您的main()
聲明時沒有返回類型,這自 C99 以來一直是非法的。
有不同種類的“錯誤”。 某些錯誤會導致編譯器發出診斷消息。 一些錯誤只會讓您的程序在運行時表現出不可預測的行為(表現出未定義的行為)。 后者可能更難檢測,因為“不可預測”乍一看可能看起來非常好。
在您的情況下,刪除#include <stdio.h>
將在 C99 編譯器中觸發診斷消息,但只會導致 C89/90 編譯器中的未定義行為。 未定義的行為可能仍會產生與以前相同的屏幕輸出。
刪除 \n 不會有任何問題,因為 '\n' 是換行符。 所以以前你的輸出是 **"Hello World
"** (newline) 現在你的輸出是"Hello World"這就是你看不到任何區別的原因。
刪除\n
時沒有出錯的原因是因為它是一個轉義序列,表示換行符。 添加或刪除轉義序列不會導致錯誤,除非代碼的其他部分不受影響。 例如,如果您僅從\
\n
中刪除 \,這將導致錯誤,因為您的"
將被轉義為\"
。
對於第二種情況,要么您在運行代碼之前沒有再次構建代碼,要么您的 IDE 將自行設置它。 刪除#include
行會導致錯誤,因為您的printf()
函數是在stdio.h
頭文件中聲明的。 如果沒有函數聲明,調用函數會導致錯誤。
如果您使用任何 shell,最好在文本編輯器中編寫代碼並在 shell 中使用 gcc 編譯它,如下所示:
gcc filename.c
默認情況下,可執行文件將命名為a.out
。 可以使用man gcc
閱讀有關gcc
的更多信息。
案例二:
如果沒有#include<stdio.h>
中的printf()
原型,許多編譯器會使用 C99 之前的標准。 假設該函數具有int printf(...)
的原型,其中所有參數(包括格式)都通過通常的參數提升而沒有類型檢查。 由於代碼傳遞了預期的格式參數並返回了int
,因此代碼可以正常工作。 如果代碼是printf(5.0)
,它可能會編譯但在執行時會崩潰。
從“ Hello world \n”中刪除“\n”不會產生任何錯誤,但它可能會在執行時產生不同的結果。 根據操作系統的不同,它可能什么也不寫,直到下一次“\n”被發送到標准輸出,或者直到輸出緩沖區刷新。
#include<Stdio.h>
//this contains the function used to print which is printf(); also puts();
int main()//The the main function in code simply the one with highest importance
{//opening braces
printf("hello world\n");//this prints the word and \n enters a newline
puts("hello world");//does the exact same thing
return 0; //means if the program runs correctly then return the no zero to screen
}//closing braces
//anything that has those 2 forward slashes are comments and they aren't compiled
嗯,您的代碼似乎沒有任何錯誤,對於第二種情況,您確定要重新編譯嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.