15 12
发新话题
打印

C语言里面的隐函数

C语言里面的隐函数

隐函数是我的叫法,如果不正确,请更正我,我会改标题。

函数有返回值。先来看一个显性的函数,比如scanf(),返回输入的参数的个数。
复制内容到剪贴板
代码:
while(scanf("%d %d") == 2) {
     // 这个表示只要文件还有 参数, 并且能输入两个, 就继续
     // 这是因为 scanf() 会返回成功读入的参数的个数
}
暂时想到两个隐函数:

1. , 逗号表达式
复制内容到剪贴板
代码:
while( scanf("%d %d", &a, &b), a+b ) {
    // 这个表示只要读入的两个数字的和不为0就继续 (我没测试过负数对 表达式真假的影响 ,我迟点测试一下)
}
2. == 相等判断表达式

我们要判断 a 和 b 是不是都等于 1, 不能这样判断
复制内容到剪贴板
代码:
if(a == b == 1)
这是因为,这样的话,是另外一个结果:

把 a和b 是否相等的值和 1 比较。就是说,只要 a 和 b 相等,if条件就成立。

3. 其实 C 的表达式本身都会有返回值,所以表达式本身就是隐函数。这贴算是水贴吧~~
Fluke's Blog
I'm a user.
lz有没有研究过这种形式什么意思

case 'a':
   printf("...");

   {
       int i;
       i= 3;
   }

   break;

  


不知道中间怎么会凭空出来个大括号 而且居然编译没有问题
痞子
{} 本身应该是可以出现在代码任意的地方的吧,在这里是不需要的阿,但是也并不错(case:是用break来结束的)。可能作者有自己的约定,把这些工作写成一个block会好看一点。

然而,我认为这样的代码风格很不好。应该避免。
Fluke's Blog
I'm a user.
原来是些可有可无的东西?

偶最近研究snort的源码  发现多处有这种情况
痞子
我也想找个时间来看看代码。最近都比较郁闷。
Fluke's Blog
I'm a user.
版主周末有什么郁闷的   无聊的时候可以玩呀
痞子
版主能不能解释一下这段代码什么意思

typedef void (*grinder_t)(Packet *, struct pcap_pkthdr *, u_char *);  /* ptr to the packet processor */

grinder_t grinder;
痞子
grinder_t是个函数指针吧。

这种情况,内核里面很多结构体都能见到,我也见过audacious里面的插件接口也是这样定义的。

我很少写这么复杂的代码,不知道解释对不对。

比较郁闷是因为最近一些网络比赛比如topcoder srm, 百度之星等都做的很差,证明自己实力还是有差距。

skykingf叫我 fluke 就好了,呵呵
Fluke's Blog
I'm a user.
grinder_t确实是个函数指针 我看后来的代码都是直接把指针类型的函数名直接付给grinder使用

其实也就是让grinder指向那些函数

疑惑的是后面括号里的那三个参数

偶再看看那些被grinder指向的函数是不是也是这些参数

fluke xd  天外有天  人外有人嘛  
只要比自己以前有提高就是满好的
痞子
参数要满足的,我做过。

如果你写过内核模块就知道,如果你要实现系统的一些功能,比如文件系统的一个操作,都需要按照系统指定的格式,因为内核要往里面传递参数。

你看的是snort的代码?
Fluke's Blog
I'm a user.
 15 12
发新话题