初学者,我在Code :: Blocks -
上键入以下hello world程序#include<stdio.h>
main()
{
printf("Hello world \n");
}
现在,我点击“Build and Run”,输出屏幕显示“Hello world”。
但是,我正在阅读的这本书建议我删除该程序的某些元素,以查看程序中发生的错误。
我做了2次更改。首先,我从程序中删除了\ n。 (这本书告诉我,没有\ n,运行程序时会出错)但是,当我点击“Build and Run”时,输出屏幕会给我相同的输出,当它没有任何错误时。
我做的第二个更改是从程序中删除#include。即使是现在,输出屏幕也会显示与没有错误时相同的输出。
为什么会这样?请告诉我如何解决这个问题?
我使用的编译器是GNU GCC编译器。
编辑:根据建议,我添加了-wall,-wextra,-pedantic。现在,当我点击“Build and Run”时,它说找不到-1-wall,-1-wextra和-1-pedantic,程序也没有运行。现在该如何解决这个问题?
答案 0 :(得分:4)
案例1:你的书错了。删除\n
绝不会引发任何错误。 \n
表示newline,它将在 Hello World 之后打印一个新行。
案例2:可能您没有再次构建代码,因为如果不包含stdio
(表示标准输入/输出),您可能无法调用printf()
函数您使用较新的C标准(C99,C11)。详细了解stdio.h。
请注意,在C99之前的标准中,如果删除原型(#include <stdio.h>
),C将自动为函数提供隐式声明。看起来像这样:
int printf();
意味着,它将获取任意数量的参数并返回int
。但在C99中,隐含的减速被删除了。所以很可能你的编译器不会面对C99。
看看here,编译好!
详细了解implicit declarations in c。
编辑:正如评论中提到的AnT,删除#include<stdio.h>
,对printf的调用将&#34;编译&#34;在C99之前的语言版本中。但是,调用将产生未定义的行为。即使在C89 / 90中,也必须在调用之前使用原型声明变量函数(如printf)。否则,行为未定义。
答案 1 :(得分:2)
您的程序已包含错误。必须使用显式指定的返回类型声明现代C中的函数。您的main()
声明没有返回类型,自C99以来一直是非法的。
有不同种类的&#34;错误&#34;。某些错误会导致编译器发出诊断消息。某些错误只会使您的程序在运行时出现不可预测的行为(表现出未定义的行为)。后者可能更难以发现,因为&#34;不可预测&#34;第一眼看上去可能看起来很完美。
在您的情况下,删除#include <stdio.h>
将在C99-compiliant编译器中触发诊断消息,但在C89 / 90编译器中将导致仅仅未定义的行为。未定义的行为可能仍会产生与以前相同的屏幕输出。
答案 2 :(得分:0)
通过删除\ n,您没有看到任何问题,因为'\ n'是一个换行符。 所以以前你的输出是 **“Hello World
“**(换行) 现在你的输出是 “Hello World” 这就是为什么你没有看到任何区别。
答案 3 :(得分:0)
删除\n
时未收到错误的原因是因为它是escape equence表示换行符。除非代码的其他部分不受影响,否则添加或删除转义序列不会导致错误。例如,如果您仅从\
中删除\n
,则会导致错误,因为您的"
将被转义为\"
。
对于第二种情况,要么在运行之前没有再次构建代码,要么IDE会自行设置代码。删除#include
行会导致错误,因为在printf()
头文件中声明了stdio.h
函数。如果没有函数声明,调用fucntion会导致错误。
如果您正在使用任何shell,最好是在文本编辑器中编写代码并使用shell中的gcc编译它:
gcc filename.c
可执行文件默认命名为a.out
。有关gcc
的更多信息,请参阅man gcc
。
答案 4 :(得分:0)
案例2:
如果printf()
中没有#include<stdio.h>
原型,许多编制者都会使用C99之前的标准。这假定函数具有int printf(...)
的原型,其中所有参数(包括格式都通过通常的参数促销而没有类型检查)。由于代码传递了预期的格式参数并且返回了int
,因此代码工作正常。如果代码为printf(5.0)
,则可能会编译但执行时崩溃。
答案 5 :(得分:0)
从“Hello world \ n”中删除“\ n”不会产生任何错误,但 MAY 会在执行时产生不同的结果。根据操作系统的不同,它可能会在下一次将“\ n”发送到stdout或直到输出缓冲区刷新时才写入任何内容。
答案 6 :(得分:0)
#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