熟悉C的人都知道,C语言支持可变参数函数(Variable Argument Functions),即参数的个数可以是不定个,在函数定义的时候用(...)表示,比如我们常用的printf()\execl函数等;printf函数的原型如下:
int printf(const char *format, ...); |
注意,采用这种形式定义的可变参数函数,至少需要一个普通的形参,比如上面代码中的*format,后面的省略号是函数原型的一部分。
C语言之所以可以支持可变参数函数,一个重要的原因是C调用规范中规定C语言函数调用时,参数是从右向左压入栈的;这样一个函数实现的时候,就无需关心调用他的函数会传递几个参数过来,而只要关心自己用到几个;以printf为例:
printf("%d%sn",i,s); |
printf函数在定义的时候,不知道函数调用的时候会传递几个参数。在实现上,printf函数只需关心第一个参数,即字符串“%d%s\n”,当读到%d的时候,printf知道自己需要第二个参数,这时只需要去栈上寻找即可;当读到%s时,再去栈上网上寻找一个参数即可。简单说,printf不关心栈上到底压了多少参数,只关心自己需要多少。
那么对于一个定义为可变参数的函数,函数定义的时候并没有定义形参原型,怎么使用参数呢?
今天在CSDN上看到一个有意思的小题目,题目如下:
int main(){ if(/*在此填入一个语句*/) printf("Hello"); else printf(" World!"); } |
要求填入一个语句,能够使上面的程序顺利打印出helloworld。
我们都知道,&&是逻辑与, ||是逻辑或。对于这两个运算符,有下面的性质:
1 && 1 = 1; 1 && 0 = 0; 0 && 1 = 0; 0 && 0 = 0; 1 || 1 = 1; 1 || 0 = 1; 0 || 1 = 1; 0 || 0 = 0; |
出了这些基本的性质之外,额外需要注意的是,在C语言中,这两个运算符有如下的性质:
- && 的 优先级高于 ||。
让我们看如下代码:
最新回复评论