本章将开发你的第一个C语言程序:传统的 "Hello, world!"程序。然后讨论一些编辑器和编译器的选项,并阐述移植性问题。
#include #include int main(void) {puts("Hello, world!");return EXIT_SUCCESS;}
在Linux和其他类似Unix的操作系统上,你可以用cc命令调用系统编译器:
(资料图)
$cc hello.c$lsa.out hello.c$./a.outHello, world!% cc -o hello hello.c% ./helloHello, world!
cc命令有许多标志和编译器选项。例如,-o文件标志让你给可执行文件起名字,而不是a.out。
hello.c程序的前两行使用了#include预处理器指令,它的行为就像你在完全相同的位置用指定文件的内容替换它一样。我们包括
C定义了两种可能的执行环境:独立的和托管的。独立环境可能不提供操作系统,通常用于嵌入式编程。这些执行环境提供了一套最小的库函数,程序启动时调用的函数的名称和类型是执行环境定义的。
我们定义main返回int类型的值,并将void放在括号内,表示该函数不接受参数。int类型是有符号的整数类型,可以用来表示正、负整数值以及零。与其他程序性语言类似,C语言程序由可以接受参数和返回值的过程(称为函数)组成。每个函数都可重用,你可以根据需要在程序中频繁调用。在本例中,主函数返回的值表示程序是否成功终止。
puts("Hello, world!")打印出"Hello, world!"。 puts函数是标准库函数,它将字符串参数写入stdout(通常代表控制台或终端窗口),并在输出中附加换行符。如果不需要换行可以使用fputs。
return语句退出程序,向主机环境或调用脚本返回一个整数值。EXIT_SUCCESS是类似对象的宏,通常扩展为0,通常定义为:#define EXIT_SUCCESS 0。
函数通常会返回一个计算结果的值,或者表示函数是否成功完成了它的任务。例如,我们在 "Hello, world!"程序中使用的puts函数需要打印字符串并返回int类型的值。如果发生写入错误,puts函数返回宏EOF的值(负整数);否则,它返回非负的整数值。
尽管对于我们的简单程序来说,puts函数不太可能失败并返回EOF,但这是可能的。因为对puts的调用可能会失败并返回EOF,这意味着你的第一个C程序有bug,或者,可以按以下方法改进。
#include #include int main(void) { if (puts("Hello, world!") == EOF) { return EXIT_FAILURE; // code here never executes } return EXIT_SUCCESS; // code here never executes}
注意(puts("Hello, world!")一定要有括号,否则编译会报错:
c$ cc hello2.chello2.c: In function ‘main’:hello2.c:5:5: error: expected ‘(’ before ‘puts’5 | if puts("Hello, world!") == EOF {| ^~~~| (
puts函数是一种将字符串写入stdout的简单好方法,但最终你会需要使用printf函数来打印格式化的输出--例如,打印字符串以外的参数。printf函数接收定义输出格式的格式化字符串,然后是可变数量的参数,这些参数是你想打印的实际数值。例如,如果你想用printf函数来打印Hello, world!,你可以这样写。printf("%s\n", "Hello, world!")。
第一个参数是格式字符串"%s\n"。%s是转换规范,指示printf函数读取第二个参数(字符串字面)并将其打印到stdout。\n是一个字母转义序列,用于表示非图形字符,并告诉函数在该字符串后面包括新行。
注意不要将用户提供的数据作为第一个参数的一部分传递给printf函数,因为这样做会导致格式化输出的安全漏洞(Seacord 2013)。
可以使用各种编辑器和集成开发环境来开发你的C语言程序。图1-1显示了最常用的编辑器,根据2018年JetBrains的调查。
对于Microsoft Windows,Microsoft的Visual Studio IDE(https://visualstudio.microsoft.com/)是不错的选择。Visual Studio有三个版本。社区版、专业版和企业版。社区版的优点是免费,而其他版本的功能则需要付费。
对于Linux来说,Vim、Emacs、Visual Studio Code和Eclipse都可选择。Vim是许多开发者和高级用户的首选编辑器。它是一个基于vi编辑器的文本编辑器,由Bill Joy在1970年代为Unix的一个版本编写。它继承了vi的按键绑定,但也增加了原vi所缺少的功能和可扩展性。你可以选择安装Vim插件,如YouCompleteMe(https://github.com/Valloric/YouCompleteMe/)或deoplete(https://github.com/Shougo/deoplete.nvim/),为C语言编程提供本地语义完成。
GNU Emacs是可扩展的、可定制的、免费的文本编辑器。它的核心是Emacs Lisp的解释器,这是一种Lisp编程语言的方言,具有支持文本编辑的扩展功能--尽管我从未发现这是个问题。
Visual Studio Code(VS Code)是精简的代码编辑器,支持开发操作,如调试、任务运行和版本控制。它提供了开发人员所需的工具,以实现快速的代码构建--调试循环。VS Code可以在macOS、Linux和Windows上运行,对私人或商业使用都是免费的。
现在有很多C语言编译器,他么编译器实现了不同版本的C标准。许多用于嵌入式系统的编译器只支持C89/C90。用于Linux和Windows的流行编译器更努力地支持现代版本的C标准,直到并包括对C2x的支持。
GCC已经被采纳为Linux系统的标准编译器,尽管也有用于微软Windows、macOS和其他平台的版本。在Linux上安装GCC很容易。例如,下面的命令在Ubuntu上安装GCC 8。
$ sudo apt-get install gcc-9$ gcc --versiongcc (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0Copyright (C) 2019 Free Software Foundation, Inc.This is free software; see the source for copying conditions. There is NOwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.$ sudo dnf install gcc # Fedora
$ sudo apt-get install clang你可以用下面的命令测试你所使用的Clang的版本。% clang --version$ clang --versionclang version 10.0.0-4ubuntu1Target: x86_64-pc-linux-gnuThread model: posixInstalledDir: /usr/bin
Windows最流行的开发环境是Microsoft Visual Studio,它包括IDE和编译器。它与Visual C++ 2019捆绑在一起,其中包括C和C++编译器。你可以在项目属性页上为Visual Studio设置选项。在C/C++下的高级选项卡上,确保你通过使用编译为C代码(/TC)选项而不是编译为C++代码(/TP)选项来编译为C代码。默认情况下,当你命名一个以.c为扩展名的文件时,它是用/TC编译的。如果文件被命名为.cpp、.cxx或其他一些扩展名,则用/TP编译。
https://url97.ctfile.com/f/18113597-810419181-1f9306 下载密码 订阅号pythontesting 发送 密码 。
每个C语言编译器的实现都至少有一点不同。编译器不断发展,因此,例如,像GCC这样的编译器可能提供对C17的完全支持,但正在努力实现对C2x的支持,在这种情况下,它可能有一些C2x的功能实现,但没有其他。因此,编译器支持全部的C标准版本(包括中间的版本)。C语言实现的总体发展是缓慢的,许多编译器明显落后于C标准。
如果为C语言编写的程序只使用标准中规定的语言和库的那些功能,就可以认为是严格符合标准的。这些程序的目的是为了最大限度地提高可移植性。然而,由于实现行为的范围,现实世界中没有一个C语言程序是严格符合要求的,也不会是(可能也不应该是)。相反,C标准允许你编写符合要求的程序,这些程序可能依赖于非可移植的语言和库特性。
通常的做法是为一个参考实现编写代码,或者有时为几个实现编写代码,这取决于你打算在哪个平台上部署你的代码。C标准是确保这些实现不会有太大的差异,并允许你一次针对几个实现,而不必每次都学习一种新的语言。在C标准文件的附件J中列举了五种可移植性问题。
实现定义的行为
未指定的行为
未定义的行为
针对本地的行为
常见的扩展
实现定义的行为实现定义的行为是指C语言标准中没有规定的程序行为,它可能在不同的实现中提供不同的结果,但在一个实现中具有一致的、有记录的行为。实现定义的行为的一个例子是一个字节中的位数。
实现定义的行为大多是无害的,但在移植到不同的实现时可能会导致缺陷。在可能的情况下,避免编写依赖于实现定义的行为的代码,这些行为在你可能用来编译你的代码的C实现中是不同的。C标准的附件J.3中列举了实现定义行为的完整列表。你可以通过使用static_assert声明来记录你对这些实现定义的行为的依赖。
未指定的行为是指标准提供了两个或多个选项的程序行为。该标准对在任何情况下选择哪个选项没有要求。每次执行一个给定的表达式可能会有不同的结果,或者产生与之前执行相同表达式不同的值。未指定行为的一个例子是函数参数存储布局,它在同一程序中的不同函数调用中可能会有所不同。避免编写依赖于C标准附件J.1中列举的非指定行为的代码。
未定义的行为未定义的行为是指C标准没有定义的行为,或者说是 "在使用不可移植的或错误的程序结构或错误的数据时,标准没有规定的行为"。未定义行为的例子包括有符号的整数溢出和解读一个无效的指针值。具有未定义行为的代码往往是错误的,但比这更有细微差别。标准中对未定义行为的识别如下。
当违反了 "应当 "或 "不应当 "的要求,并且该要求出现在约束条件之外时,该行为是未定义的
当行为被明确规定为 "未定义行为 "时
通过省略任何明确的行为定义前两种未定义行为经常被称为显式未定义行为,而第三种则被称为隐式未定义行为。这三者之间的重点没有区别,它们都描述了未定义的行为。C语言标准附件J.2 "未定义行为 "包含了C语言中显式未定义行为的列表。
开发者经常误认为未定义的行为是C标准中的错误或遗漏,但将行为归为未定义的决定是有意的,也是经过考虑的。C标准委员会将行为归类为未定义的行为是为了做到以下几点。
这些选项都不是很好(尤其是第一个),所以最好避免未定义的行为,除非实现指定这些行为的定义是为了让你调用一个语言增强功能。
特定于本地的行为取决于每个实现所记录的国籍、文化和语言的本地惯例。通用扩展在许多系统中被广泛使用,但并不能移植到所有的实现中。
在这章中,你学会了如何编写简单的C语言程序,编译它,并运行它。然后,我们看了几个编辑器和交互式开发环境,以及一些编译器,你可以用它们来开发Windows、Linux和macOS系统上的C语言程序。一般来说,你应该使用较新版本的编译器和其他工具,因为它们往往支持C编程语言的较新功能,并提供更好的诊断和优化。如果较新版本的编译器破坏了你现有的代码,或者你正准备部署你的代码,你可能不想使用较新版本的编译器,以避免在你已经测试过的应用程序中引入不必要的变化。在本章的最后,我们讨论了C语言程序的可移植性。
标签:
上一篇 : 1960-2022,韩国老了26岁,我国19岁,美国呢?-今日关注
下一篇 : 最后一页
最新推荐
本章将开发你的第一个C语言程序:传统的"Hello,world!"程序。然后讨论一些编辑器和编译器的选项,并阐述...
1960-2022,韩国老了26岁,我国19岁,美国呢?,韩国,美国,巴西,日本,中位数
科技日报北京5月9日电(记者刘霞)美国医生首次成功对仍在子宫内的胎儿实施了脑部手术,以修复其畸形的血管
本文内容是由小编为大家搜集关于天宸股份,以及天宸股份(600620)股吧的资料,整理后发布的内容,让我们赶快
一、行业概述1、重卡的概念及分类重卡即重型卡车,指的是车和货物总质量14吨以上的载货汽车或用于牵引货物
1、歌手名:代理仁歌曲名:预谋预谋-代理仁何必要那么多的借口-让我内疚自己还爱的不够预谋了很久不过是想
1、那个根本就开不了。2、肯定开不了嘛。本文到此分享完毕,希望对大家有所帮助。
1、谢霆锋。2、是一位明星,也是穿越火线的代言人。以上就是【谢霆锋穿越火线mp3下载,谢霆锋穿越火线】相
1、T9北京西-重庆北15:20-15:451天25分硬座231硬卧下418K819北京西-重庆北09
长期以来,榴莲凭借独特的风味以及较为昂贵的价格,被誉为“水果之王”。但近期不少人发现,市面上的“...
2022年浙江养老金上调细则什么时候公布?具体怎么调整?(说明:2022年的资料整理中,请参考2021年浙江养老
1、“泛在网”即广泛存在的网络,它以无所不在、无所不包、无所不能为基本特征,以实现在任何时间、任何...
1、衷心是发自内心。2、忠心是对人或事物忠诚。本文到此分享完毕,希望对你有所帮助。
1、答:冒险岛护肩砸黑卷、V卷、X卷2、黑卷、V卷、X卷可用于肩饰,因此也有部分玩家会将这三种卷应用在神秘
5月9日,智车派从特斯拉官方了解到,特斯拉得克萨斯州锂精炼厂正式破土动。特斯拉得克萨斯州锂精炼厂正
模拟发生7 0级地震内蒙古消防开展实战拉动演练---图为消防救援人员开展支撑加固横向破拆救援科目演练。中新
中国经济网北京5月9日讯银保监会网站昨日公布的扬州银保监分局行政处罚信息公开表(扬银保监罚决字〔2023〕
视频加载中 三湘都市报5月8日讯(全媒体记者杨昱)5月8日,由湖南省民政厅、湖南日报社共同举办的全省养
本周五,这场高校毕业生别错过。共青团郑州市委联合郑州市职业介绍中心、52就业网,将于5月12日在郑州市经
今年以来,成都市金堂县各企业坚持开局即决战,起步即冲刺,以“拉满弓、上满弦”的奋斗姿态,全力以赴...
赛力斯(601127)05月09日在投资者关系平台上答复了投资者关心的问题。
1、有:哭泣、呐喊、书写、打球、跑步、跳绳、听音乐、吃东西、旅游、喝酒、睡觉、打游戏、健身、倾诉、洗
今天来聊聊关于旧唯物主义和辩证的唯物主义在认识论上的根本区别,辩证唯物主义和旧唯物主义关于认识的根本
浙大网新05月09日主力资金净流入1 71亿元,涨跌幅为4 14%,主力净量(dde大单净额 流通股)为1 96%,两市排名17 4976。
在莞城新光明市场,莞城农业技术服务中心工作人员一大早就将“东莞市定点屠宰肉品溯源牌”张挂在肉品经...
2023福建厦门国际光伏储能行业大会暨新能源产业展览会1 太阳能光伏:A 光伏生产设备:硅棒硅块硅锭生产设备:
每经AI快讯,有投资者在投资者互动平台提问:贵公司下游客户是否受到半导体去库存影响?晶升股份(688478 S
以下是光庭信息在北京时间5月9日13:15分盘口异动快照:5月9日,光庭信息盘中跌幅达5%,截至13点15分,报50
1、意识是物质世界长期发展的产物。2、意识是社会历史的产物,劳动在意识产生中起决定性的作用。3、意识的
水羊股份(300740)05月09日在投资者关系平台上答复了投资者关心的问题。
市民“零距离”体验无人机。本报记者韩伟摄夜幕降临,美轮美奂的无人机灯光秀点亮了城市的夜晚,为市民...
一、逃离部队罪追诉时效逃离部队罪的追诉时效是五年的时间,逃脱罪的最高刑罚不超过五年的有期徒刑,所以追
东方财富证券股份有限公司高博文近期对科锐国际进行研究并发布了研究报告《2023年一季报点评:23Q1支付节奏
李靖刚刚过去的“五一”小长假,让全国乃至世界人民见证了中国消费市场的蓬勃活力和巨大潜力。新冠肺炎...
一、现在劳务派遣是临时工吗现在劳务派遣不一定是临时工。劳动派遣是只是一种用工的方式,不一定都是临时工
足球赛规定领导上场15分钟可点球今天的热度非常高,现在也是在热搜榜上了,那么具体的足球赛规定领导上场15
客户可以通过电话向客户服务部门提出还款计划请求。要确保提出的还款计划是可行和合理的,应根据自己的还款
艾路获得锋锐,天梯也开始迎来较大的变化,在这个偏攻的环境,我认为杂技攻天蝎对于目前很多的受队和攻队都
西班牙连日来遭遇严重高温和干旱。数据显示,西班牙4月的平均气温比常年同期平均水平高出3摄氏度,而当月平
独角兽企业作为新兴经济业态的代表企业,既是衡量国家创新发展的重要风向标,也是国家竞争力的重要组成部分
据中国驻加拿大使馆网站消息,5月8日,中国驻加拿大使馆发言人就加方要求中方一名领事官员限期离境发表谈话
1、看得出你活得很迷茫,每天都不知道自已要干嘛,首先如果没工作。2、啃老一族的呢,最好去找份工作,免得
1、季文彦,出生地点:山东省,北京电影制厂一级导演。2、毕业于北京电影学院导演系,此前曾在部队从事戏剧
1、像这种情况的话你复查的这个值是因为吃了优甲乐才正常的。2、如果你现在停止吃优甲乐的话有可能会马上反
5月8日(周一)的A股市场,可能让很多股民都想不到,它在中字头以及银行股大涨的烘托下,沪指大涨1 81%,让
北京时间5月8日,中国足协官网发布《关于对河南足球俱乐部队球员舒尼奇违规违纪的处罚决定》,河南外援舒尼
自2021年部分理财产品陆续爆雷开始,曾对标嘉能可雪松控股最终陨落。5月7日,广州市公安局黄埔区分局官方公
(记者蔡敏婕)国产ECMO产品已经开始瞄准全球市场,积极参与国际竞争。随着ECMO救治水平的逐步提升及国产ECMO
1、assassinn 暗杀者,刺客assassinatorn 刺客(尤指刺杀政治要人者)stabbern 刺客tri
在人工智能领域,AGI(ArtificialGeneralIntelligence,人工通用智能)无疑是极具有挑战性和吸引力的。在此
中国广电入局5G网络 初步形成“有线+5G”的融合发展新格局
成都抗疫的外籍志愿者:愿为城市“康复”贡献力量
最新快讯!两部门就二手房中介费等提具体意见 业内:可降低交易过程中非必要成本
当前讯息:求职被录用后又因乙肝被拒?法院判罚:就业歧视,赔钱!
乌克兰:俄罗斯既没有军事,也没有经济,也不敢尝试大规模进攻 报资讯
全球观天下!MSI抽签结果公布,LCK、LPL春决重演?欧美观众绝望:败者组见
【天天新要闻】泰和县市场监管局:热消费维权无小事 为民调解暖人心
今日关注:资料:英超联赛2022-2023赛季第35轮积分榜
当前通讯!游客吐槽“一桌8个菜,仅1个荤菜,卖528元”,大理回应
【环球新要闻】贴心负责的父母都为孩子们准备了这个:小寻儿童电话手表A3
【天天播资讯】打野和中下双C的重要性!三届S赛冠军,为啥打野拿了两次FMVP?
环球微速讯:48v20ah电池充电需要多长时间_48v20ah电池多少钱呢
江苏南通发现国外输入性疟疾病例 疾控提醒:如不及时诊治或危及生命 天天快播
每日快播:节后第一个「坏消息」,业绩「腰斩」,天地壹号中止主板 IPO
天天热资讯!中国商业联合会:5月份中国零售业景气指数持续回升
皮奥利:特奥是神奇的球员,他必须痴迷于成为世界最佳边卫 全球速看料
Copyright © 2015-2022 华东律师网版权所有 备案号:京ICP备2022016840号-41 联系邮箱:2 913 236 @qq.com