我的全栈之路-C语言基础之HelloWorld
3.1 Visual Studio 2019实现HelloWorld
- 新建解决方案
在之前创建的Git仓库c-core-programming基础上新建项目
然后选择项目模板:基于C++的空项目
然后设置项目名称、路径以及解决方案名称
- 新建筛选器
在解决方案资源管理器视图下,选中源文件,然后新建筛选器
筛选器的名称为Chapter1
-
新建项
新建源文件helloworld.c -
编辑源文件
#include <stdio.h> #include<stdlib.h> int main(int argc, char* argv[]) { printf("Windows10 1903 & Visual Studio 2019 Hello World \n"); system("pause"); return 0; }
- 运行helloworld
点击本地Windows调试器,可以运行程序,也可以通过快捷键F5启动本地Windows调试器来运行程序
程序运行结果
如果想要关闭程序,可以通过快捷键Shift+F5实现。
如果运行程序时出现如下提示
可以根据提示设置在调试时停止自动关闭控制台
Visual Studio遇到printf()语句自动弹出终端输出Windows10 1903 & Visual Studio 2019 Hello World,遇到return语句关闭终端,打开终端和关闭终端时间很短,感觉程序有闪退现象。
这里可以调用stdlib.h头文件中的system函数并传递字符串参数pause让程序暂停。
- 推送代码到远程仓库
首先切换到团队资源管理器视图下,然后点击更改
然后填写提交信息,点击全部提交,此时会将代码提交到本地仓库
然后点击同步到远程仓库
推送到远程仓库
然后就可以在GitHub仓库中查看提交的内容
!c-core-programming
3.2 HelloWorld详解
3.2.1 #include预处理
在C语言中,如果想要调用系统的某个函数,必须首先包含该函数声明所在的头文件,例如hellowrld程序中调用printf()函数声明,就是位于系统目录C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\ucrt下的头文件stdio.h。
如果包含的文件在当前目录下,使用#include "头文件",如果该头文件在系统目录下,则使用#include <>。而编译器查找当前目录下的头文件时如果未找到,还会去系统目录下查找对应的头文件。
#include的本质就是将包含的头文件内容全部复制到源文件中去。
如何验证这一点呢?
首先在项目c-core-programming-foundational的头文件下新建筛选器Chapter1,并创建头文件guanglei.h
然后把之前源文件helloworld.c的源码复制到guanglei.h中
之后定义源文件guanglei.c
该源文件的内容只需要使用#include "guanglei.h" 即可运行。
但是Visual Studio 2019 解决方案(例如c-core-programming)下每个项目(c-core-programming-foundational)只能有一个包含main方法的源程序,否则程序运行时会出错。
这里将之前helloworld程序中的main方法改成别的名字(例如helloworld_main)即可。
然后再次运行程序,运行结果和之前的helloworld程序结果一样
#include <stdio.h>表示包含头文件stdio.h,std表示标准库,是可以移植的。也就是helloworld.c可以运行在各个操作系统下。
Windows10 1903 &CLion 2019.2
Ubuntu18.04 & CLion 2019.2
运行之前必须先安装CMake,使用sudo apt install cmake安装即可
macOS10.14 &XCode10.3
而stdio表示标准输入输出,printf()函数正是一个输出函数。
stdlib表示标准库,system()函数正是一个标准库函数。
头文件只存放了函数的定义,至于函数的实现,在对应的系统库文件中。
如果想要了解你的C程序依赖了哪些系统库,在Linux(Ubuntu)下可以使用ldd命令查看
3.2.2 main函数
main函数是C程序的入口,一个项目只能有一个main函数,否则程序运行时会提示定义多个main函数。
当程序运行时,系统自动调用main函数,程序从main函数的第一行开始执行,如果其他函数想要得到执行,那么必须被main函数直接或者间接调用
int helloworld_main(int argc, char* argv[]) { printf("Windows10 1903 & Visual Studio 2019 Hello World \n"); system("pause"); return 0; }
-
main函数左边的int是函数的返回值,右边()的内容表示函数的参数,外部数据通过函数的参数传递到函数的内部处理。
-
{}表示函数的函数体,也就是函数执行的所有内容都包含在{}中,它是成对出现的。
-
printf函数是系统自带的函数,用于将""包含的字符串按照指定的格式输出到终端,终端可以是控制台、网页或者是文件,目前是输出到控制台。
-
\n表示换行,这里就是输出内容之后换行。
-
分号(;)表示一条语句结束,C语言每条执行语句都需要以分号(;)结束,如果不加上分号会发生编译错误。
-
system("pause")表示程序暂停,输入任意键后退出,如果在Visual Studio中编写C程序必须加上system("pause"),否则程序运行完成后就直接退出。使用CLion、QT不需要加上system("pause")。
-
return 0表示将int类型的值返回给main函数的调用方(系统)并结束main函数,return语句之后的代码都不会再执行了,0表示正常结束。
在源文件function.c中定义了一个add方法,传递两个整数参数,返回两个整数相加的结果。并且该方法在主函数的prinf方法中被调用,用于输出两个整数相加的结果。
printf函数中的%d表示对应位置的参数按照整数输出。
#include <stdlib.h> int add(int source,int target) { return source + target; printf("不可达代码\n"); } int main(int argc,char* argv[]) { int source = 50; int target = 100; printf("%d加上%d的结果是%d\n",source,target,add(source,target)); system("pause"); return 0; }
程序运行结果表明add方法的return语句之后的输出语句printf("不可达代码\n")并没有执行,如果想要add方法得到执行,在main方法中调用即可,调用时需要传递对应的参数。
3.3.3 注释
注释是用于描述程序的功能,为了便于程序后期的维护,在开发过程中应该添加适量的注释,编译器在预编译时会删除注释,所以注释的内容不会影响程序的结果。
C语言中支持的注释包含单行注释(//)和多行注释(/**/)两种,单行注释顾名思义就是注释一行,多行注释可以注释多行,需要注意的是多行注释不能够嵌套使用,否则会发生编译错误。
增加单行注释和多行注释后的helloworld程序
#include <stdio.h> #include<stdlib.h> /* 我的第一个C程序 @author liuguanglei ittmelinedotnet@gmail.com @version 2019/08/20 */ int main(int argc, char* argv[]) { //快捷键F12可以查看函数定义 Ctrl+ -返回 printf("Windows10 1903 & Visual Studio 2019 Hello World \n"); system("pause"); return 0; }
3.4 Windows常用命令
3.4.1 Windows命令概述
主流的操作系统(Windows,Linux(Ubuntu),MacOS)及大多数应用程序都提供了基于命令行和图形化界面两种交互方式,而移动端是采用手势触控、语音等进行交互。作为普通用户来讲,图形化界面容易上手,而且交互效果更加直观。
但是作为一个程序员来讲,应该去熟悉各个操作系统的命令行的使用,因为命令行相对图形化界面而言,绝大多数场景下使用更加高效。而且图形化界面本质是对命令行的封装,能用图形化界面实现的基本都可以采用命令行实现。而且在服务器端(CentOS,RedHat)基本上是不会安装图形界面。
Windows下想要使用命令,必须首先启动控制台。
Windows系统可以使用快捷键Windows+r调出运行
后输入cmd,便可以进入Windows下的命令行终端
3.4.2 Windows常用命令
在启动Windows的终端(也称为控制台)之后,便可以运行命令了。
如果你使用Windows作为开发平台,如下的命令你也许会经常使用到。
命令名称 | 功能描述 |
---|---|
dir | 列出当前目录列表 |
cd | 切换目录(只能在根盘符(例如C盘)内切换) |
md | 创建目录 |
del | 删除文件 |
type | 显示文本文件内容 |
echo | 输出文本内容 例如echo %path% 查看系统环境变量 |
ping | 检测网络,例如ping baidu.com |
notepad | 记事本 |
calc | 计算器 |
mspaint | 画图 |
explore | 文件资源管理器 |
cleanmgr | 磁盘清理 |
desk.cpl | 分辨率设置 |
powercfg.cpl | 电源设置 |
regedit | 注册表编辑器 |
msconfig | 系统配置 |
mstsc | 远程连接 |
firewall.cpl | 防火墙 |
appwiz.cpl | 添加或修改程序 |
tasklist | 查看进程列表 |
taskkill /f /im process-name.exe | 关闭指定进程 |
netstat -ano| indstr "port" |
查看端口占用 |
msinfo | 系统信息 |
sticky notes | 便签 |
ipconfig | 查看ip |
winver | 查看windows版本 |
cls | 清除屏幕内容 |
exit | 退出终端 |
3.5 system函数的使用
system函数用于C程序中调用各大操作系统的命令和应用程序,被调用的命令和应用程序以字符串的方式作为system函数的参数传入。
实现读取用户输入的命令,并执行该命令
#include <stdio.h> #include <stdlib.h> /* 使用system函数执行用户输入的命令 @author tony ittimelinedotnet@gmail.com @version 2019/08/20 */ int main(int argc,char* argv[]) { printf("请输入你要执行的命令\n"); //定义数组保存用户输入的指令 char str[100] = { 0 }; //使用scanf_s函数读取用户输入的指令 scanf_s("%s", str); //执行命令 system(str); return 0; }
因为system函数位于stdlib.h头文件中,意味着它是一个可以跨平台使用的函数,Visual Studio 2019中可以使用F12快捷键跳转到函数的定义。使用Ctrl+-快捷键实现后退。
但是各大操作系统的命令和应用程序是不相同的,例如在Windows上使用system函数传递字符串参数"notepad"时可以打开记事本,而移植到了类Unix上则无法调用记事本。