C语言编程漫谈——main函数
写在前面
促使我写这篇文章是因为我这几天找了几个一样是大三的同学,与我相同专业相同方向(物联网)的人,除了@小胡同的诗,基本没有什么其他人会现在看起来很简单的编程题目了。问了一下其他同学,他们大部分都说自己C语言是混过的,因为之前老师教的时候说不会指针||结构体||函数 不会写也没有关系,然后他们居然还能过省二级(C语言)???结果到了大三,没人给他们做大腿了,所以基本上课堂上就进入了“休眠模式”,后面的东西基本都听不懂了……所以来这里给大一大二还在学习C语言的同学一点小小的建议。这样才能编的下去代码。
Main函数
总所周知,所有C语言程序基本上都有个Main函数,哪怕是操作系统的代码也逃不过这个Main函数,如果没有Main函数最直接的后果是编译器不知道刚开始的代码在哪里,于是规定使用main函数作为整个程序的入口,一般来说,在完成初始化操作之后放入运行程序栈底位置,有Main函数内部的调用来决定以何种顺序来使用汇编好的各种函数位置。
在《C语言程序设计》厦门大学版(也就是福建省版)
中一个典型的Main函数长成这样子
int main() //Main函数返回一个整形变量来表明自己运行情况,默认无参数
{
//函数体 随便写点什么...
return ; //需要返回值,以便给操作系统留下遗言
}
我们看出在这个函数里面,参数部分没有任何参数,因为一般的程序不需要使用什么参数直接就能运行了,一个典型的Hello world里面直接就写printf("Hello world\n");就完事了,也没有什么特别的变换。
为什么要有返回值,如果这段代码不是计算机运行的第一个程序(也就是操作系统),那么就需要一个返回值,让操作系统知道这个程序到底运行的怎么样?是好还是坏,由于某种原因,我们这里采用0作为没有错的返回值。
最可能原因的是0相当于false,操作系统问程序:嘿,程序,你运行的怎么样? 程序:没问题(0,false),操作系统就知道程序没有运行错就不用去管他了,如果程序运行的好好,突然由于一些意外的事情导致没有退出,操作系统就能知道程序到底出了什么错。
但是main函数往往不是这个样子,你可能还讲过下面的Main函数形式
谭浩强/MSDN/C51 典型的main函数
void main() //不需要返回值,所以类型为void 空
{
//函数体
}
说起来谭浩强也可能被上古的MSDN的示例坑了,才在自己的C语言书里面写void main()的,MSDN里面的示例真的充满了Void Main
// CalculatorTutorial.cpp : This file contains the 'main' function. Program execution begins and ends there.
// #include "pch.h"
#include <iostream> void main() //现在是int main()
{
std::cout << "Hello World!\n";
} // Run program: Ctrl + F5 or Debug > Start Without Debugging menu
// Debug program: F5 or Debug > Start Debugging menu // Tips for Getting Started:
// 1. Use the Solution Explorer window to add/manage files
// 2. Use the Team Explorer window to connect to source control
// 3. Use the Output window to see build output and other messages
// 4. Use the Error List window to view errors
// 5. Go to Project > Add New Item to create new code files, or Project > Add Existing Item to add existing code files to the project
// 6. In the future, to open this project again, go to File > Open > Project and select the .sln file
当然排除错误写法之后,void main还常见于C51的程序,C51是应用在8051系列单片机上的一种C语言的变种,主要的编译器为Keil,由于C51编写的程序是直接在裸机(无操作系统)上跑的程序,所以不需要返回值(因为也没有地方可以理你的返回值),但这个只是来自有着40年历史老单片机的倔强而已,现在的单片机使用的C语言跑的编译器一般还是要求使用 int main带返回值的形式(GCC编译器会隐式转换void main为int main带返回值的形式),当然现代的编译器还是会帮你补上返回值的
还有一种学校里面不会教的就是带有参数的main函数,这种main函数常见于Linux 编程(因为一般Linux操作系统不运行图形界面,所以如果不带参数一般无法运行)、
Liunx终端/Windows 控制台 编程中的main函数
int main(int argc,char **argv)
{
//函数体
return ;
}
argc指示的是传入的参数个数,argv为传入的指令,在Linux中传入的参数0位置一般为自己的名字例如“ls”,剩下就是可选参数位
一般刚学的同学完全没有接触过控制台编程,所以一旦遇到这种东西就会手足无措。
在Windows中你们经常使用的一个带有参数的程序,也许就是ping命令(ping 主机名,向远程主机发送ICMP报文,指示与远程主机是否能进行通信,在这种情况下“主机名”就是一个参数)
而在linux中经常使用带有参数的程序就是cat程序(查看文件内容 c)的程序,因此参数此时作为必须要有的东西
在C语言中由于没有自动维护的string类型的东西,所以只能以原始的字节串(虽然一般都称为“字符串”,但是考虑到“字符”是有“编码”的,所以只能称为“字节串”)数组的形式存放,参数argc实际上就是字节串数组第一维的个数。
下面是一个简单的使用参数的标准C语言程序:
#include<stdio.h>
#include<string.h> int main(int argc,char* argv[])
{
int i=;
if(argc<)
{
printf("Usage sample [...] to use this program!\n");
}else{
for(i=;i<argc;i++)
{
printf("arg[%d]:%s\n",i,argv[i]);
}
}
return ;
}
运行起来看看,如果在Dev C++下直接运行你看的是这样的界面
可以看到他的第一个参数就是自己。
可以看到第一个参数永远都是调用者自己的名字,后面才是输入的参数,这也是控制台程序的有用的地方。
在所有具有参数并且要求参数的控制台程序,使用时必入参数,否则argc会小于1,导致无法执行原来程序编程的功能。
例如linux中的lpcrm [-m] [-q] <编号>,这段程序用于移除在系统共享内存段或者消息队列,这些内容是属于《计算机操作系统》的相关内容,如果想要了解的同学可以提前买一本《计算机操作系统》看看,虽然可能看不懂(无奈,似乎操作系统没有图说系列)
C语言编程漫谈——main函数的更多相关文章
- Linux下C语言编程实现spwd函数
Linux下C语言编程实现spwd函数 介绍 spwd函数 功能:显示当前目录路径 实现:通过编译执行该代码,可在终端中输出当前路径 代码实现 代码链接 代码托管链接:spwd.c 所需结构体.函数. ...
- [汇编与C语言关系]2. main函数与启动例程
为什么汇编程序的入口是_start,而C程序的入口是main函数呢?以下就来解释这个问题 在<x86汇编程序基础(AT&T语法)>一文中我们汇编和链接的步骤是: $ as hell ...
- C语言的体系结构--main函数存在的必然性(听杨力祥老师的课)
注:不是原创,课堂上听来的,防止遗忘,所以记下来! C语言包括两个部分:数据和函数,当然最终这两个部分都是要进入到计算机的内存中去. 函数在编译后生成可执行代码,存放在代码区:数据分为几种:局部与全局 ...
- c语言数组放在main函数里面和外面的区别
最近a算法题的时候碰到一道题:一个数列前三项都为1,之后每项的值等于前三项之和,求第20193024项的最后4位数字.一开始写的代码如下: 结果一直爆 Terminated due to signal ...
- 一起talk C栗子吧(第一百二十七回:C语言实例--查看main函数的參数)
各位看官们,大家好,上一回中咱们说的是static关键字的样例,这一回咱们说的样例是:查看main函数的參数.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们.我们在第五十七回中介绍过mai ...
- 【转】 嵌入式C语言编程中Inline函数的应用
源地址:https://blog.csdn.net/vigour1000/article/details/9622037 有一段儿时间没写写经验笔记了,哎,也是自己这一段时间以来(其实最近一直是这个状 ...
- C/C++中如何在main()函数之前执行一条语句?
在C语言中,如果使用GCC的话,可以通过attribute关键字声明constructor和destructor(C语言中如何在main函数开始前执行函数) #include <stdio.h& ...
- C语言编程规范
C语言编程规范 6 函数与过程 6.1 函数的功能与规模设计 函数应当短而精美,而且只做一件事.不要设计多用途面面俱到的函数,多功能集于一身的函数,很可能使函数的理解.测试.维护等变得困难. 6.2 ...
- C语言与汇编的嵌入式编程:main中模拟函数的调用(两数交换)
编写一个两数交换函数swap,具体代码如下: #include<stdio.h> void swap(int *p1,int *p2) { int temp; temp = *p1; *p ...
随机推荐
- Zookeeper原理、安装、基本使用和API
ZooKeeper ZooKeeper是一种分布式协调服务, 解决应用程序的分布式带来的问题. 1 分布式应用 分布式应用可以在给定时间(同时)在网络中的多个系统上运行,通过协调它们以快速有效的 ...
- [ 随手记 5 ] C/C++ 继承
个人理解: 继承:(意译)继续承接: A继承B,则A是派生类/子类,B为基类/父类: B有的成员变量/性质,A全部都有,而A有的B不一定有,在数学集合上可以说:B是A的子集: A继承B,可以说是A在B ...
- 巧用MYSQL中SQL语句
static bool Verify(string username, string password) { //string strSql = "select * from users w ...
- 报文 HTTP HTTPS
报文是网络中交换与传输的数据单元,即站点一次性要发送的数据块.报文包含了将要发送的完整的数据信息,其长短很不一致,长度不限且可变. 报文也是网络传输的单位,传输过程中会不断的封装成分组.包.帧来传输, ...
- JQ方法实用案例///鼠标移动到div和修改ipt中弹窗、CSS鼠标变小手、JQ获取元素属性、JQ选择器
今天学习了jQ,jQ对js的帮助很大,菜鸟教程上也有属性.可以查看 js 和 jquery主要的区别 在 dom 想用jquery 必须先引入(顺序问题) 先css 再js: ...
- win10连接宽带,拨号提示错误720:不能建立到远程计算机的连接,解决方法
使用账号密码登录时,一直报720错误.解决方法是卸载以下IP驱动.卸载之后重新连接就正常了.亲测有效
- C# 程序修改config文件后,不重启程序刷新配置ConfigurationManager
基本共识: ConfigurationManager 自带缓存,且不支持 写入. 如果 通过 文本写入方式 修改 配置文件,程序 无法刷新加载 最新配置. PS. Web.config 除外:Web. ...
- python 基础之python的六大标准数据类型
一:Number 数字类型(int float bool complex) 1.整型: (正整数 0 负整数)#(1)二进制用0b表示intvar = 0b1010print(intvar)pr ...
- 部署activiti 5.15.1的Activiti Explorer
1.从官网下载activiti包,将其中的activiti-explorer.war文件拷贝到tomcat的webapps目录下: 2.将mysql驱动包文件mysql-connector-java- ...
- .NET MVC 表主外键关系 JSON 无限循环 方案二(推荐)
public class JsonResultObject:JsonResult { private Newtonsoft.Json.JsonSerializerSettings Settings { ...