繁体   English   中英

初学者的 hello world C 程序?

[英]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)。 否则,行为未定义。

  1. 您的程序已经包含错误。 现代 C 中的函数必须用明确指定的返回类型声明。 您的main()声明时没有返回类型,这自 C99 以来一直是非法的。

  2. 有不同种类的“错误”。 某些错误会导致编译器发出诊断消息。 一些错误只会让您的程序在运行时表现出不可预测的行为(表现出未定义的行为)。 后者可能更难检测,因为“不可预测”乍一看可能看起来非常好。

    在您的情况下,删除#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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM