C语言入门

Download c eBook

备注

C是一种通用的命令式计算机编程语言,支持结构化编程,词法变量范围和递归,而静态类型系统可防止许多意外操作。通过设计,C提供了有效映射到典型机器指令的结构,因此它已经在以前用汇编语言编写的应用程序(包括操作系统)以及从超级计算机到嵌入式系统的各种计算机应用软件中得到了长期使用。 。

尽管该语言具有低级功能,但该语言旨在鼓励跨平台编程。可以为各种各样的计算机平台和操作系统编译符合标准且可移植编写的C程序,其源代码几乎没有变化。从嵌入式微控制器到超级计算机,这种语言已经广泛应用于各种平台。

C最初由Dennis Ritchie于1969年至1973年间在贝尔实验室开发,用于重新实现Unix操作系统。它已成为有史以来使用最广泛的编程语言之一,来自不同供应商的C编译器可用于大多数现有的计算机体系结构和操作系统。

通用编译器

编译C程序的过程在编译器和操作系统之间有所不同。大多数操作系统都没有编译器,因此您必须安装一个。一些常见的编译器选择是:

以下文档应该为您提供有关如何开始使用一些最常见的编译器的良好概述:

编译器C版支持

请注意,编译器对标准C具有不同级别的支持,许多仍然不完全支持C99。例如,自2015年发布以来,MSVC支持C99的大部分,但仍然有一些重要的例外支持语言本身(例如预处理似乎不符合)和C库(例如<tgmath.h> ),也没有他们是否必须记录他们的“依赖于实现的选择”。 维基百科有一个表格,显示一些流行编译器提供的支持。

一些编译器(特别是GCC)提供或继续提供编译器扩展 ,这些扩展实现了编译器生产者认为必要,有用或相信可能成为未来C版本的一部分的附加功能,但目前不是任何C标准的一部分。由于这些扩展是特定于编译器的,因此可以认为它们不是交叉兼容的,并且编译器开发人员可以在以后的编译器版本中删除或更改它通常可以通过编译器标志来控制这种扩展的使用。

此外,许多开发人员的编译器仅支持他们所针对的环境或平台强加的特定C版本。

如果选择编译器,建议选择对目标环境允许的最新C版本具有最佳支持的编译器。

代码风格(这里是偏离主题):

因为C中的空格是无关紧要的(也就是说,它不会影响代码的操作),程序员经常使用空格来使代码更容易阅读和理解,这称为代码风格 。它是编写源代码时使用的一组规则和准则。它涵盖的问题包括如何缩进行,是否应使用空格或制表符,如何放置大括号,如何在操作符和括号周围使用空格,如何命名变量等等。

代码风格不在标准范围内,主要是基于意见(不同的人发现不同的风格更容易阅读),因此,它通常被认为是关于SO的偏离主题。在一个人自己的代码中,关于样式的最重要的建议是,一致性是最重要的 - 选择或制作一种风格并坚持下去。只需解释一下,通常使用的各种命名样式通常由程序员选择,而不是创建自己的样式。

一些常见的缩进样式有:K&R风格,Allman风格,GNU风格等。其中一些样式有不同的变体。例如,Allman被用作常规的Allman或流行的变体Allman-8。有关一些流行风格的信息可以在维基百科上找到。这些样式名称取自作者或组织经常发布的标准,供许多参与其代码的人使用,这样每个人都可以在知道样式时轻松阅读代码,例如构成部分代码的GNU格式指南GNU编码标准文档。

一些常见的命名约定是:UpperCamelCase,lowerCamelCase,lower_case_with_underscore,ALL_CAPS等。这些样式以各种方式组合以用于不同的对象和类型(例如,宏通常使用ALL_CAPS样式)

通常建议在SO文档中使用K&R样式,而不鼓励使用更为深奥的样式,例如Pico。

C标准未涵盖的库和API(因此在这里偏离主题):

版本

标准发布日期
K&R N / A 1978年2月22日
C89 ANSI X3.159-1989 1989年12月14日
C90 ISO / IEC 9899:1990 1990年12月20日
C95 ISO / IEC 9899 / AMD1:1995 1995年3月30日
C99 ISO / IEC 9899:1999 1999-12-16
C11 ISO / IEC 9899:2011 2011-12-15

你好,世界

要创建一个在屏幕上打印“Hello,World”的简单C程序,请使用文本编辑器创建一个新文件(例如hello.c - 文件扩展名必须为.c ),其中包含以下源代码:

你好ç

#include <stdio.h>

int main(void)
{
    puts("Hello, World");
    return 0;
}
 

Coliru现场演示

让我们逐行看看这个简单的程序

#include <stdio.h>

int main(void)
{
    puts("Hello, World");
    return 0;
}
 

该行告诉编译器在程序中包含标准库头文件stdio.h 的内容。标头通常是包含函数声明,宏和数据类型的文件,您必须在使用之前包含头文件。这一行包括stdio.h 因此它可以调用函数puts()

详细了解标题。

#include <stdio.h>

int main(void)
{
    puts("Hello, World");
    return 0;
}
 

该行开始定义函数。它声明了函数的名称( main ),它所期望的参数的类型和数量( void ,表示无),以及此函数返回的值的类型( int )。程序执行从main() 函数开始。

#include <stdio.h>

int main(void)
{
    puts("Hello, World");
    return 0;
}
 

花括号成对使用以指示代码块的开始和结束位置。它们可以在很多方面使用,但在这种情况下,它们指示函数的开始和结束位置。

#include <stdio.h>

int main(void)
{
    puts("Hello, World");
    return 0;
}
 

此行调用puts() 函数将文本输出到标准输出(默认情况下为屏幕),然后是换行符。要输出的字符串包含在括号内。

"Hello, World" 是将写入屏幕的字符串。在C中,每个字符串文字值必须在双引号"…"

详细了解字符串。

在C程序中,每个语句都需要用分号(即; )终止。

#include <stdio.h>

int main(void)
{
    puts("Hello, World");
    return 0;
}
 

当我们定义main() ,我们将它声明为返回int 的函数,这意味着它需要返回一个整数。在此示例中,我们返回整数值0,用于指示程序已成功退出。 return 0; 声明,执行过程将终止。

编辑程序

简单的文本编辑器包括Linux上的vim gedit ,或Windows上的Notepad 。跨平台编辑器还包括Visual Studio Code Sublime Text

编辑器必须创建纯文本文件,而不是RTF或其他任何格式。

编译并运行该程序

要运行该程序,首先需要将此源文件( hello.c )编译为可执行文件(例如,在Unix / Linux系统上为hello 或在Windows上为hello.exe )。这是使用C语言的编译器完成的。

查看有关编译的更多信息

使用GCC编译

GCC (GNU Compiler Collection)是一种广泛使用的C编译器。要使用它,请打开终端,使用命令行导航到源文件的位置,然后运行:

#include <stdio.h>

int main(void)
{
    puts("Hello, World");
    return 0;
}
 

如果在源代码( hello.c )中没有发现错误,编译器将创建一个二进制文件 ,其名称由-o 命令行选项( hello )的参数给出。这是最终的可执行文件。

我们还可以使用警告选项-Wall -Wextra -Werror 来帮助识别可能导致程序失败或产生意外结果的问题。它们不是这个简单程序所必需的,但这是添加它们的方法:

#include <stdio.h>

int main(void)
{
    puts("Hello, World");
    return 0;
}
 

使用clang编译器

要使用clang 编译程序,您可以使用:

#include <stdio.h>

int main(void)
{
    puts("Hello, World");
    return 0;
}
 

根据设计, clang 命令行选项与GCC类似。

从命令行使用Microsoft C编译器

如果在支持Visual Studio的Windows系统上使用Microsoft cl.exe 编译器并且设置了所有环境变量,则可以使用以下命令编译此C示例,该命令将在执行命令的目录中生成可执行文件hello.exe (有一些警告选项,例如cl /W3 ,大致类似于GCC或clang的-Wall 等)。

#include <stdio.h>

int main(void)
{
    puts("Hello, World");
    return 0;
}
 

执行程序

编译完成后,可以通过在终端中输入./hello 来执行二进制文件。执行时,编译的程序将打印Hello, World ,然后是换行符,打印到命令提示符。

原创“Hello,World!”在K&R C.

以下是原版“Hello,World!” Brian Kernighan和Dennis Ritchie 编写的The C Programming Language一书(Ritchie是贝尔实验室C编程语言的原始开发人员),被称为“K&R”:

K&R
#include <stdio.h>

main()
{
    printf("hello, world\n");
}
 

请注意,在编写本书第一版(1978)时,C编程语言并未标准化,并且该程序可能无法在大多数现代编译器上编译,除非他们被指示接受C90代码。

K&R书中的第一个例子现在被认为质量很差,部分原因是它缺少main() 的显式返回类型,部分原因是它缺少return 语句。本书的第2版是为旧C89标准编写的。在C89中, main 的类型默认为int ,但K&R示例不会向环境返回定义的值。在C99及更高版本的标准中,返回类型是必需的,但是可以安全地省略main (并且只有main )的return 语句,因为C99 5.1.2.2.3引入了特殊情况 - 它相当于返回0 ,这表明成功。

当程序不使用任何命令行参数时,托管系统的推荐和最可移植的main 形式是int main (void) ,或者当程序使用命令行参数时, int main(int argc, char **argv)


C90§5.1.2.2.3 程序终止

从初始调用到main 函数的返回等效于使用main 函数返回的值作为其参数调用exit 函数。如果main 函数执行不指定值的返回,则返回到主机环境的终止状态是未定义的。

C90§6.6.6.4 return 声明

如果执行了没有表达式的return 语句,并且调用者使用了函数调用的值,则行为是未定义的。到达终止函数的} 等同于执行不带表达式的return 语句。

C99§5.1.2.2.3 程序终止

如果main 函数的返回类型是与int 兼容的类型,则从初始调用返回main 函数等效于调用exit 函数,并将main 函数返回的值作为其参数;到达终止main 函数的} 返回值0.如果返回类型与int 不兼容,则返回到主机环境的终止状态未指定。

Stats

4443 Contributors: 67
Thursday, July 27, 2017
许可下: CC-BY-SA

不隶属于 Stack Overflow
Rip Tutorial: info@zzzprojects.com

下载电子书