当前位置: 首页 > news >正文

C语言学习趣事_关于C语言中的输入输出流

      不知道什么原因,基本上所有的C语言入门书籍的第一个C语言实体,都是“Hello Word!”;我不知道这是不是行业的“潜规则”, 就像某些行业的潜规则一样,不过这个都不重要了,重要的是就是“她”把无数的程序员带进了计算机的世界;不管是合格的程序员,还是不合格的程序员(就像我似的)。

      说来也奇怪,就那么些简单的字符经过不知道什么物理变化还是化学变化后,居然就能在计算机上显示出"Hello Word!"。

      我记得我第一次摸电脑时,不知道怎么开机, 当然以为关机就像关电视一样......哈哈,到目前为止我还经常关电脑就像关电视机一样(当然这是在计算机当机之后);记得第一看计算机基础的时候, 说要在计算机上安装软件, 我以为就像在墙上安装电灯一样,需要把计算机的壳子打开,然后再把要安装的软件用螺丝拧到机壳上就完事了................

      下面进入本次瞎掰的主题:

#include <stdio.h>

int main(int argc,char **argv)

{

      printf("Hello Word!");

}

    我至目前为止还不明白这些字母是怎么把字符显示到电脑屏幕上的,不知道这些字符是怎么驱动电子怎么运动的, 反正我在学校的时候知道如果用与非门的电子器件是可以驱动LED指示灯显示出一些信息的,就像目前流行的LED显示屏一样, 哈哈哈.....................实在是惭愧。

    几乎所有的C语言教材,都会明确的指出,printf();这个不是C语言定义的基本组成元素,而是由系统或者编译器提供商提供的一个应用接口。一般其函数原型应该是这样的:

    int  printf(const char *,...);

    这里有个问题,我们学习函数定义的时候,教材应该是这样说的:

    函数修饰符  函数返回值类型   函数标识符(函数参数列表)

Exp:

    stdcall int  max(int x,int y);

就是函数形式参数在声明函数原型的时候必须指定函数参数的数据类型, 即:  函数修饰符 函数返回值类型 函数标识符(参数类型1,参数类型2);

但是我们的printf()函数的参数列表里面有一个: ...  ; 那么在函数的参数列表里面具有(...) 是什么意思呢?

我上学的时候老师推荐的是谭的书,可以我从头翻到尾,又从尾部翻到头, 都没有发现怎么解释这个问题, 难怪有些人会在一些地方大骂谭的书不怎么样,想想还真不是空穴来风(这里说这个,完全没有任何别的意思,只是想说明,中国的教育界,真的很..............). 为了弄明白这个问题我苦苦的等了六年,整整六年(大一学C,毕业两年了);

在那本经典的书里面有这么一段话:

       头文件<stdagr.h>提供了遍历未知数目和类型的函数表的功能。

      假设函数F带有可变数目的实参,lastarg是他的最后一个命名的形式参数,那么在函数F内声明一个类型为va_list的变量ap,它将依次指向每个实际参数:

Exp:    va_list ap;

     在访问任何未命名的参数前,都必须用va_start宏初始化ap一次:

Exp:    va_start(va_list ap,lastarg);

    此后每执行宏va_arg都将产生一个与下一个未命名的参数具有相同类型和数值的值,它同时还修改ap; 以使得下一次执行宏va_arg是返回下一个参数:

Exp:   type  va_arg(va_list ap,type )

    在所有的参数处理完毕后,且在退出F函数之前,必须调用一次va_end宏一次,如下所示:

Exp:    void va_end(va_list ap);

下面我们简单的看看这个宏怎么使用:

我们模仿一个printf函数的实现:

unsigned int myprintf(const char *format,...)

{

     va_list varg;

     char    *p,

               chSave;

     int    iGetInPut;

     double fGetInput;

     va_start(varg,format);   // 初始化参数

     for(p=format;*p;P++)

     {

           if('%' != *p)

            {

              putchar(*p);

              continue;

             }

           switch(*(p++) )

            {

                  case d:

                      iGetInput=va_list(ap,int);

                      printf("%d",iGetInput);

                      break;

                 case f:

                    fGetInPut=va_list(ap,float);

                    printf("%f",fGetInPut);

                    break;

               case s:

                   chGetInPut=va_list(ap,char);

                   putchar(chGetInPut);

                   break;

               default:

                   putchar(*p);

                   break;

            }

     }

     va_end(varg);      

}

哈哈, 模仿的一个程序...............

至于怎么实现这个varg,那决定于系统和开发的编译器...............

为了实现变参数,需要进行判断..............判断每一个输入不定参数的类型............

转载于:https://www.cnblogs.com/volcanol/archive/2011/06/07/2073685.html

相关文章:

  • ios7下不能录音问题解决
  • iCloud的真正目的:置Windows于死地
  • json数据与字符串的相互转化
  • 服务器跟不上,网站打开慢,服务器自动重启,怎么办?
  • 盒子游戏(湖南省第七届大学生计算机程序设计竞赛)
  • cout设置16进制大写输出
  • Exchange2010 SP1配置证书
  • RPC、RMI、HTTP、REST的区别
  • apache日志轮询技术(cronolog and rotatelogs)小结
  • Lambda表达式和匿名方法中不支持yield return
  • 通过HTML调用C# [架构]
  • 创建dynamics CRM client-side (五) - 使用regular expression (正则表达式)来检查phone number...
  • C# 中 LISTVIEW用法
  • 【基本数据结构】并查集-C++
  • 如何将数据库从SQL Server迁移到MySQL
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • Android组件 - 收藏集 - 掘金
  • extjs4学习之配置
  • Git 使用集
  • iOS 系统授权开发
  • JAVA 学习IO流
  • Javascript弹出层-初探
  • java第三方包学习之lombok
  • jquery cookie
  • leetcode388. Longest Absolute File Path
  • php面试题 汇集2
  • Protobuf3语言指南
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • VUE es6技巧写法(持续更新中~~~)
  • 订阅Forge Viewer所有的事件
  • 前端知识点整理(待续)
  • 浅谈Golang中select的用法
  • 容器服务kubernetes弹性伸缩高级用法
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 微信小程序设置上一页数据
  • 用element的upload组件实现多图片上传和压缩
  • 由插件封装引出的一丢丢思考
  • ​创新驱动,边缘计算领袖:亚马逊云科技海外服务器服务再进化
  • ​香农与信息论三大定律
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • #宝哥教你#查看jquery绑定的事件函数
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (ZT)薛涌:谈贫说富
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (简单) HDU 2612 Find a way,BFS。
  • (免费领源码)Java#ssm#MySQL 创意商城03663-计算机毕业设计项目选题推荐
  • (三十五)大数据实战——Superset可视化平台搭建
  • (算法设计与分析)第一章算法概述-习题
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .NET Core 中插件式开发实现
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .Net 访问电子邮箱-LumiSoft.Net,好用