省略号的意思是什么意思

博客访问: 756111
博文数量: 94
博客积分: 3308
博客等级: 中校
技术积分: 788
注册时间:
APP发帖 享双倍积分
IT168企业级官微
微信号:IT168qiye
系统架构师大会
微信号:SACC2013
分类: C/C++
前言: 本文在很大程度上改编自网友kevintz的“C语言中可变参数的用法”一文,在行文之前先向这位前辈表示真诚的敬意和感谢。 一、什么是可变参数 我们在C语言编程中有时会遇到一些参数个数可变的函数,例如printf()函数,其函数原型为: int printf( const char* format, ...); 它除了有一个参数format固定以外,后面跟的参数的个数和类型是可变的(用三个点“…”做参数占位符),实际调用时可以有以下的形式: printf("%d",i); printf("%s",s); printf("the number is %d ,string is:%s", i, s); 以上这些东西已为大家所熟悉。但是究竟如何写可变参数的C函数以及这些可变参数的函数编译器是如何实现,这个问题却一直困扰了我好久。本文就这个问题进行一些探讨,希望能对大家有些帮助. 二、写一个简单的可变参数的C函数 先看例子程序。该函数至少有一个整数参数,其后是占位符…,表示后面参数的个数不定. 在这个例子里,所有的输入参数必须都是整数,函数的功能是打印所有参数的值. 函数代码如下: //示例代码1:可变参数函数的使用 #include "stdio.h" #include "stdarg.h" void simple_va_fun(int start, ...) { va_list arg_ int nArgValue = int nArgCout=0; //可变参数的数目 va_start(arg_ptr,start); //以固定参数的地址为起点确定变参的内存起始地址。 do { ++nArgC printf("the %d th arg: %d\n",nArgCout,nArgValue); //输出各参数的值 nArgValue = va_arg(arg_ptr,int); //得到下一个可变参数的值 } while(nArgValue != -1);
} int main(int argc, char* argv[]) { simple_va_fun(100,-1); simple_va_fun(100,200,-1); return 0; } 从这个函数的实现可以看到,我们使用可变参数应该有以下步骤: ⑴在程序中将用到以下这些宏: void va_start( va_list arg_ptr, prev_param ); type va_arg( va_list arg_ptr, type ); void va_end( va_list arg_ptr ); va在这里是variable-argument(可变参数)的意思. 这些宏定义在stdarg.h中,所以用到可变参数的程序应该包含这个头文件. ⑵函数里首先定义一个va_list型的变量,这里是arg_ptr,这个变量是指向参数地址的指针.因为得到参数的地址之后,再结合参数的类型,才能得到参数的值。 ⑶然后用va_start宏初始化⑵中定义的变量arg_ptr,这个宏的第二个参数是可变参数列表的前一个参数,也就是最后一个固定参数。 ⑷然后依次用va_arg宏使arg_ptr返回可变参数的地址,得到这个地址之后,结合参数的类型,就可以得到参数的值。然后进行输出。 ⑸设定结束条件,这里的条件就是判断参数值是否为-1。注意被调的函数在调用时是不知道可变参数的正确数目的,程序员必须自己在代码中指明结束条件。至于为什么它不会知道参数的数目,读者在看完下面这几个宏的内部实现机制后,自然就会明白。三、可变参数在编译器中的处理 我们知道va_start,va_arg,va_end是在stdarg.h中被定义成宏的, 由于1)硬件平台的不同 2)编译器的不同,所以定义的宏也有所不同,下面看一下VC++6.0中stdarg.h里的代码(文件的路径为VC安装目录下的\vc98 \include\stdarg.h) typedef char * va_ #define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) #define va_start(ap,v) ( ap = (va_list)&v + _INTSIZEOF(v) ) #define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) #define va_end(ap) ( ap = (va_list)0 ) 下面我们解释这些代码的含义: 1、首先把va_list被定义成char*,这是因为在我们目前所用的PC机上,字符指针类型可以用来存储内存单元地址。而在有的机器上va_list是被定义成void*的 2、定义_INTSIZEOF(n)主要是为了某些需要内存的对齐的系统.这个宏的目的是为了得到最后一个固定参数的实际内存大小。在我的机器上直接用sizeof运算符来代替,对程序的运行结构也没有影响。(后文将看到我自己的实现)。 3、va_start的定义为&v+_INTSIZEOF(v),而&v是最后一个固定参数的起始地址,再加上其大小后,就得到了第一个 可变参数的起始内存地址。所以我们运行va_start(ap, v)以后,ap指向第一个可变参数在的内存地址,有了这个地址,以后的事情就简单了。 这里要知道两个事情: ⑴在intel+windows的机器上,函数栈的方向是向下的,栈顶指针的内存地址低于栈底指针,所以先进栈的数据是存放在内存的高地址处。 (2)在VC等绝大多数C编译器中,参数进栈的顺序是由右向左的,因此, 参数进栈以后的内存模型如下图所示:最后一个固定参数的地址正好位于第一个可变参数之下,并且是连续存储的。 |—— —————————————| | 最后一个固定参数 | ->高内存地址处 |— ——————————————| ........................ |-------------------------------| | 第N个可变参数 | ->va_arg(arg_ptr,datatype)后arg_ptr所指的地方 |-------------------------------| ................... |——— ————————————| | 第一个可变参数 | ->va_start(arg_ptr,start)后arg_ptr所指的地方 | | 即第一个可变参数的地址 |——————————————— | |————————————— ——| | | | 最后一个固定参数 | -> start的起始地址 |—————————————— —| ............... |——————————————- | | | |——————————————— | -> 低内存地址处 (4) va_arg():有了va_start的良好基础,我们取得了第一个可变参数的地址,在va_arg()里的任务就是根据指定的参数类型取得本参数的值,并且把指针调到下一个参数的起始地址。 因此,现在再来看va_arg()的实现就应该心中有数了: #define va_arg(ap,t) ( *(t *)((ap += _INTSIZEOF(t)) - _INTSIZEOF(t)) ) 这个宏做了两个事情, ①用用户输入的类型对参数地址进行强制类型转换,得到用户所需要的值 ②计算出本参数的实际大小,将指针调到本参数的结尾,也就是下一个参数的首地址,以便后续处理。 (5)va_end宏的解释:x86平台定义为ap=(char*)0;使ap不再 指向堆栈,而是跟NULL一样.有些直接定义为((void*)0),这样编译器不 会为va_end产生代码,例如gcc在linux的x86平台就是这样定义的. 在这里大家要注意一个问题:由于参数的地址用于va_start宏,所 以参数不能声明为寄存器变量或作为函数或数组类型. 关于va_start, va_arg, va_end的描述就是这些了,我们要注意的 是不同的操作系统和硬件平台的定义有些不同,但原理却是相似的. 四、可变参数在编程中要注意的问题 因为va_start, va_arg, va_end等定义成宏,所以它显得很愚蠢, 可变参数的类型和个数完全在该函数中由程序代码控制,它并不能智能 地识别不同参数的个数和类型. 有人会问:那么printf中不是实现了智能识别参数吗?那是因为函数 printf是从固定参数format字符串来分析出参数的类型,再调用va_arg 的来获取可变参数的.也就是说,你想实现智能识别可变参数的话是要通过在自己的程序里作判断来实现的. 例如,在C的经典教材《the c programming》的7.3节中就给出了一个printf的可能实现方式,由于篇幅原因这里不再叙述。五、小结: 1、标准C库的中的三个宏的作用只是用来确定可变参数列表中每个参数的内存地址,编译器是不知道参数的实际数目的。 2、在实际应用的代码中,程序员必须自己考虑确定参数数目的办法,如 ⑴在固定参数中设标志—— printf函数就是用这个办法。后面也有例子。 ⑵在预先设定一个特殊的结束标记,就是说多输入一个可变参数,调用时要将最后一个可变参数的值设置成这个特殊的值,在函数体中根据这个值判断是否达到参数的结尾。本文前面的代码就是采用这个办法——当可变参数的值为-1时,即认为得到参数列表的结尾。 无论采用哪种办法,程序员都应该在文档中告诉调用者自己的约定。这是一个不太方便 3、实现可变参数的要点就是想办法取得每个参数的地址,取得地址的办法由以下几个因素决定: ①函数栈的生长方向 ②参数的入栈顺序 ③CPU的对齐方式 ④内存地址的表达方式 结合源代码,我们可以看出va_list的实现是由④决定的,_INTSIZEOF(n)的引入则是由③决定的,他和①②又一起决定了va_start的 实现,最后va_end的存在则是良好编程风格的体现—将不再使用的指针设为NULL,这样可以防止以后的误操作。 4、取得地址后,再结合参数的类型,程序员就可以正确的处理参数了。理解了以上要点,相信有经验的读者就可以写出适合于自己机器的实现来。下面就是一个例子 六、实践——自己实现简单的可变参数的函数。 下面是一个简单的printf函数的实现,参考了中的156页的例子,读者可以结合书上的代码与本文参照。 #include "stdio.h" #include "stdlib.h" void myprintf(char* fmt, ...) //一个简单的类似于printf的实现,参数必须都是int 类型 { char* pArg=NULL; //等价于原来的va_list
pArg = & //注意不要写成p = fmt !!因为这里要对参数取址,而不是取值 pArg += sizeof(fmt); //等价于原来的va_start do { c =* if (c != '%') { putchar(c); //照原样输出字符 } else { //按格式字符输出数据 switch(*++fmt) { case 'd': printf("%d",*((int*)pArg));
case 'x': printf("%#x",*((int*)pArg));
} pArg += sizeof(int); //等价于原来的va_arg } ++ }while (*fmt != '\0'); pArg = NULL; //等价于va_end
} int main(int argc, char* argv[]) { int i = 1234; int j = 5678; myprintf("the first test:i=%d\n",i,j); myprintf("the secend test:i=%d; %x;j=%d;\n",i,0xabcd,j); system("pause"); return 0; } 在intel+win2k+vc6的机器执行结果如下: the first test:i=1234 the secend test:i=78;
阅读(7265) | 评论(0) | 转发(0) |
相关热门文章
给主人留下些什么吧!~~
请登录后评论。已收藏本页面
我今天用短信向女同学表白,她回复是省略号,到底是什么意思?我问我的好兄弟他 神回复:这六个点是含蓄的告诉你,不要表白了,出家去当和尚吧。。。
六点开始来六发。你不能达到一夜六次还是知难而退吧!
4楼牛逼。。。
对你无语阿!
没直接拒绝,就大胆去追吧!!!骚年
4楼才是正解!
省略号的意思是默认同意了!大胆去追吧,孩子。
回她六个逗号
和尚头上3个点是沙弥戒,9个点是菩萨戒。
坐等大神。
再说,小心jj
既然给你回了就不是拒绝你的意思,小子好好表现吧
楼上都挺精辟的
而且最少60分
她发给你一排卵子,你回她一排逗号(精子)
坟。。。。
原来如此...
我弟弟医学院的,他告诉我那是排卵的意思……
六楼正解。
。。。。。。是由魔兽世界里来的,也有可能别的地方也会用到,大部分的意思代表无语的意思!!或者是,额,或者比较囧的感觉!!
上楼说的有理
卵子等待精子
和尚头上是九个点,兄弟你还有机会。
我好像在哪看见过,说……是我一直爱着你
……无语的意思
你被省略了......
意思是她知道了,心情好会接受你的
她想回答你为什么不早说
和尚是12个点。。不懂别瞎说。。。
,,,,,,
回复九个点,那就是方丈!
最低要求直时超6公分
让你六个小时后去找她
六个点,小蝌蚪,等你射她...
女神在向你排卵了,让你的小蝌蚪去找妈妈
和尚是九个点哦。
六点之后来我家
她意思是还有以后看表现……
神人吶!……和尚
1楼,抄蛋师,坐等2楼来剃度
后才能发表评论
你可能喜欢的图片笑话
最受欢迎的爆笑笑话省略号表示的意思有几种?
我很无聊WGT
省略号(……),又称删节号,用于省略原文的符号.“引文的省略,用省略号标明.”“列举的省略,用省略号标明.”“说话断断续续,可以用省略号标示.”“用在表示节省原文或语句未完、意思未禁等.”①表引文或引述的话有所省略;②表重复词语的省略;③表列举同类事物和序数词语的省略;④表静默或思考;⑤表说话断断续续;⑥表语言的中断;⑦表话未说完,语意未尽.使用省略号应注意:①省略号就表示“等”、“等等”,省略号和“等”字,都可表列举省略,两者用一即可,不能同时使用;②省略号后面一般不用点号.
为您推荐:
其他类似问题
扫描下载二维码省略号的意思
饭桶不饭桶890
1.表示引述的话有所省略2.表示重复词语的省略3.表列举同类事物的省略4.表示说话断断续续5.表示语意未尽6.表示沉默或思考我大概能列出这些,不过重要的还是你平时的积累,要靠自己.
为您推荐:
其他类似问题
在此就不多说了
一般是6个点
占2个汉字格
一格写3个点
1表示说话断断续续。2表示话未说完。
表示话未说完
列举的省列
“......”省略号又称删节号。省略号是一种标号,它标志语言的省略。有的省略引文;有的标志语言的断断续续;有的标志不必尽举的事物等等。
有四种情况:1、表示说话断断续续。
2、表示列举的省略。
3、表示话未说完。
4、表示意犹未尽。
“......”省略号又称删节号。省略号是一种标号,它标志语言的省略。有的省略引文;有的标志语言的断断续续;有的标志不必尽举的事物等等。在叙述中,作者故意终止叙述,给读者留下一个含蓄的空白;有人在说话中欲言而又不言;有人在说话中被迫中断;有的暂时搁下正在进行的语言而转叙别的事物等等。这些都属于“话没有说完”,都可用省略号标志。...
一、用于引文的省略
引用别人的话、文章的语句,根据作者的需要,保留必要的,省略不必要的。例如:
1.周恩来同志用命令的口吻说:“不要管我,大家要沉着,不要慌张……”
(小学《语文》第六册《飞机遇险的时候》)
2.“她仿佛也看到了……”就是他从妹妹的表情中产生的联想。
(小学《语文》第十一册《月光曲》)
例1中,周总理在飞机遇险...
一、用于引文的省略
引用别人的话、文章的语句,根据作者的需要,保留必要的,省略不必要的。例如:
1.周恩来同志用命令的口吻说:“不要管我,大家要沉着,不要慌张……”
(小学《语文》第六册《飞机遇险的时候》)
2.“她仿佛也看到了……”就是他从妹妹的表情中产生的联想。
(小学《语文》第十一册《月光曲》)
例1中,周总理在飞机遇险...
扫描下载二维码当前位置:
>>>我会选。省略号的作用有:A.引文或引述的话里有所省略。B.列举同类..
我会选。省略号的作用有:A.引文或引述的话里有所省略。B.列举同类事物和序数词语的省略。C.表示静默或思考。D.表示话未说完,语意未尽。下面这几句话中的省略号表示什么意思?1.这幅名扬中外的画作,让我想了很多……(  )2.妈妈说:“这就是你的好朋友吧……”(  )3.春天到了,花坛里热闹起来了,紫红的、淡紫的、雪白的……美丽的鲜花装点着欣欣向荣的季节。(  )
题型:填空题难度:中档来源:同步题
1.C 2.D 3.B
马上分享给同学
据魔方格专家权威分析,试题“我会选。省略号的作用有:A.引文或引述的话里有所省略。B.列举同类..”主要考查你对&&标点符号&&等考点的理解。关于这些考点的“档案”如下:
现在没空?点击收藏,以后再看。
因为篇幅有限,只列出部分考点,详细请访问。
标点符号:书面上用于标明句读和语气的符号。“标点符号是辅助文字记录语言的符号,是书面语的组成部分,用来表示停顿、语气以及词语的性质和作用。”常用标点符号及用法:
表示一句话完了之后的停顿。用于陈述句。
鲁迅先生是伟大的文学家。
表示一句话完了之后的停顿。
爬山虎的脚长在哪儿?
用于疑问句、设问句和反问句。
没有那两只手,这里还不是一片荒坡吗?
表示强烈感情的句子末尾的停顿。
&啊,那么光明的世界!
用于感叹句或者祈使句。
你给我滚出去!
表示一句话中间的停顿。
我爱花,所以也爱养花。
&表示提示下文或总括上文。
老师说:“汤姆是一个好孩子。”
&表示提示语后的停顿。
菜架上摆满了蔬菜:菠菜、芹菜、西红柿……
表示一句话中间并列分句之间的停顿。分号表示的停顿比逗号大。
学三个月的,手艺扎根在眼里;学三年的,手艺扎根在心里。
表示书籍、文件、报刊、文章等的名称。
《少年闰土》选自鲁迅先生的小说《故乡》。
书名号里还有书名号时,外面一层用双书名号,里面一层用单书名号。
教委主任亲自撰写了《&少年文艺&》发刊词。
表示语言的省略部分。
动物园里有大象、老虎、狮子……多种动物。
表示语气的断续、延续
他用微弱的声音说:“你们要……好好学习……将来……”
表示并列的词或词组之间的停顿。
铅笔盒里有铅笔、尺子、橡皮和圆规。
& 表示引用的部分。
爸爸说:“你们爱吃花生吗?”
表示特定的称谓或需要着重的词语。
詹天佑设计了一种“人”字形线路。
表示讽刺或否定的意思。
&整天吃吃睡睡不干活,你可真“勤快”呀!
引号里面还要用引号时,外面一层用双引号,里面一层用单引号。
他问:“老师,‘垂头丧气’的‘垂’是什么意思?”
表示解释说明
我永远忘不了那一天——日。
表示话题突然转变。
那个书包很漂亮,而且装有很多东西——现在不见了!
表示声音的延长。
老师大声喊道:“预备——跑。” 标点符号的历史:中国古代文书一般不加标点符号,而是通过语感、语气助词、语法结构等断句(在文章里加入“句读符号”:句号貌似现在的句号,表示句子的完结;读号貌似现在的顿号,表示语气的停顿),有时会出现歧义、造成对文章字句的误解;例如清人赵恬养《增订解人颐新集》中“下雨天留客天留我不留”(另一说我是客,不是我)一句就有七种解释方法。但事实上中国从先秦时代就已经有标点符号,可以从20世纪以来的考古文物中见到,只不过这些符号没有统一的标准罢了。辟如在战国时代的竹简中就可以见到“└”型符号,通常表示一篇文章的结束;又如“▄”作用就融合了现代的逗号与句号,用来表示断句。在古人的记载中,《宋史·何基传》称赞何基:“凡所读书,无不加标点。义显自明,有不待论说而自见。”其实,远在甲骨文、青铜器铭文时代,中国就已有一种颇为奇特的标点符号萌芽了。清章学诚《丙辰札记》考证:“点句之法,汉以前已有之。”《增韵》云:“凡句绝则点于字之旁,读分则微点于字之间。”汉代许慎把标点符号收入《说文解字》,收了“、”号(丶),解释:“有所绝止、而识之也。”还收了“()”号(?),解释:“钩识也。”清段玉裁注:“钩识者,用钩表识其处也。……今人读书有所钩勒,即此。”,因此中国古代只不过没有现代的标点符号,而不是没有标点符号。又因为古代文书普遍不加标点符号,会给未加训练者造成阅读的困难,因此在日,马裕藻、朱希祖、钱玄同、刘复、周作人、胡适等人联名提出了《请颁行新式标点符号议案》,上海商务印书馆1919年2月出版胡适的《中国哲学史大纲》,是用白话和新式标点写作的第一部“新书”。1920年,在陈独秀、胡适等人的支持下,在上海经营一家小出版社的汪原标点、分段并出版了《水浒传》,这是中国第一次使用标点符号出版古典书籍。标点符号的使用,对中国的白话文的推广使用起了很大的作用。
发现相似题
与“我会选。省略号的作用有:A.引文或引述的话里有所省略。B.列举同类..”考查相似的试题有:
323263970418788101251912143425}

我要回帖

更多关于 破折号是什么意思 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信