程序员们帮看看这段C语言吧

来源:百度文库 编辑:超级军网 时间:2024/04/28 20:08:23

刚看到个关于C语言的blog,写的是达夫设备,贴的代码是这样的
send(to, from, count)
register short *to, *from;
register count;
{
    register n = (count + 7) / 8;
    switch(count % 8) {
    case 0:    do {   *to = *from++;
    case 7:        *to = *from++;
    case 6:        *to = *from++;
    case 5:        *to = *from++;
    case 4:        *to = *from++;
    case 3:        *to = *from++;
    case 2:        *to = *from++;
    case 1:        *to = *from++;
        } while(--n > 0);
    }
}


不知道这中函数定义方法是属于什么语言标准,还有这个do while 怎么回事,哪位知道的同学能给讲讲啊

刚看到个关于C语言的blog,写的是达夫设备,贴的代码是这样的
send(to, from, count)
register short *to, *from;
register count;
{
    register n = (count + 7) / 8;
    switch(count % 8) {
    case 0:    do {   *to = *from++;
    case 7:        *to = *from++;
    case 6:        *to = *from++;
    case 5:        *to = *from++;
    case 4:        *to = *from++;
    case 3:        *to = *from++;
    case 2:        *to = *from++;
    case 1:        *to = *from++;
        } while(--n > 0);
    }
}


不知道这中函数定义方法是属于什么语言标准,还有这个do while 怎么回事,哪位知道的同学能给讲讲啊
只记得do while 是循环了其他的都忘了。
do while和while是一回事,只不过判断放到最后。
这是比较早的参数定义方法,后来的C标准改成void send(short *to, short *from, int count)了。
register关键字请求编译器尽可能的将变量存在CPU内部寄存器中,而不是通过内存寻址访问,以提高效率。
这样做真的挺炫技的,感觉为了减少循环次数蛮拼的。。。
do while是日后再说,  while是看情况再日
do while是日后再说,  while是看情况再日
二楼水平,哈哈
这是什么垃圾代码啊。

这应该直接编译错误吧?
这个do WhILe中的那段代码是错的,编译不过的
壮东风 发表于 2015-6-26 14:50
do while和while是一回事,只不过判断放到最后。
这是比较早的参数定义方法,后来的C标准改成void send(sh ...
原来如此 这种函数定义方法用 ansi c 和 C99 编译都报错,看来是比C89还古老啊。。
这个如果case 7的话 是不是他 do while 语法上就不完整了啊,不知这个switch case 的判断和执行顺序是怎么样的
这个估计也是被当时较弱的cpu或超大量数据逼的吧,牛人都是逼出来的。。。
netxiao1 发表于 2015-6-26 14:56
do while是日后再说,  while是看情况再日
你上二楼哈。。
netxiao1 发表于 2015-6-26 14:56
do while是日后再说,  while是看情况再日
我应该把二楼让给你的。
函数返回值不说,do while里边嵌套case,这算啥玩意?case也一个break都没有。

纯粹的垃圾代码,充斥着各种逻辑错误和语法错误。
你这代码是不是没复制粘贴完全?漏了很多东西,语法错误明显,肯定通不过编译的
函数返回值不说,do while里边嵌套case,这算啥玩意?case也一个break都没有。

纯粹的垃圾代码,充斥着 ...
可能是早起函数定义语法吧,无返回值就啥也不写,看网友把函数改成了正常书写合适后,正确的验证了代码函数体部分的功能。
你这代码是不是没复制粘贴完全?漏了很多东西,语法错误明显,肯定通不过编译的
绝对一点没拉,也一点没加。网上都能搜到的。
这个是一个旧形式的函数定义。现在不是都要求使用现代形式么?
involute 发表于 2015-6-26 16:38
函数返回值不说,do while里边嵌套case,这算啥玩意?case也一个break都没有。

纯粹的垃圾代码,充斥着 ...
这个是旧式函数定义形式。函数返回值默认的是INT。不过,现在都是要求现代定义形式。象这种代码一般都是重构的呀。楼主怎么还使用如此旧的代码?
苏联小苹果 发表于 2015-6-26 20:31
可能是早起函数定义语法吧,无返回值就啥也不写,看网友把函数改成了正常书写合适后,正确的验证了代码函 ...
问题是,do while怎么能套在switch和case之间呢?明显是错得一塌糊涂的语法。

去也无踪 发表于 2015-6-26 20:54
这个是旧式函数定义形式。函数返回值默认的是INT。不过,现在都是要求现代定义形式。象这种代码一般都是 ...


我知道旧式声明,从我多少年前弃用TC2.0之后,都要求函数显式声明返回值了。
去也无踪 发表于 2015-6-26 20:54
这个是旧式函数定义形式。函数返回值默认的是INT。不过,现在都是要求现代定义形式。象这种代码一般都是 ...


我知道旧式声明,从我多少年前弃用TC2.0之后,都要求函数显式声明返回值了。
involute 发表于 2015-6-26 21:04
我知道旧式声明,从我多少年前起用TC2.0之后,都要求函数显式声明返回值了。
现在很多编译器也是直接将默认返回类型直接报错而不是警告。也是强制要求进行现代定义形式。所以,楼主应该找更好点的代码看看。
苏联小苹果 发表于 2015-6-26 15:50
原来如此 这种函数定义方法用 ansi c 和 C99 编译都报错,看来是比C89还古老啊。。
这个如果case 7的话  ...
do { }其实是不作翻译的,一路走到while(),条件满足再跳回来。
我不知道是不是因为CPU指令能力有限,在一般的CPU上,memcpy的实现已经充分利用汇编指令进行优化了,无需开发人员使用过多技巧。
去也无踪 发表于 2015-6-26 21:08
现在很多编译器也是直接将默认返回类型直接报错而不是警告。也是强制要求进行现代定义形式。所以,楼主应 ...
所以我那楼的帖子第一句话是“返回值不说”嘛,可以不算错。

但是后边的代码乱七八糟绝对是错的了。
netxiao1 发表于 2015-6-26 14:56
do while是日后再说,  while是看情况再日
通俗易懂
involute 发表于 2015-6-26 21:19
所以我那楼的帖子第一句话是“返回值不说”嘛,可以不算错。

但是后边的代码乱七八糟绝对是错的了。
然。字数补丁.exe
壮东风 发表于 2015-6-26 21:15
do { }其实是不作翻译的,一路走到while(),条件满足再跳回来。
我不知道是不是因为CPU指令能力有限,在 ...
刚看了下汇编,switch case 中每个case是一个lable, 第一次进入某个lable后执行到while()然后不满足条件再跳转回do 也就是第一个case 的lable出,不得不说作者对C语法和C编译器或汇编很了解。
这个方法应该为的是避免循环条件判读语句比要执行语句耗费的时间都长。
苏联小苹果 发表于 2015-6-27 00:13
刚看了下汇编,switch case 中每个case是一个lable, 第一次进入某个lable后执行到while()然后不满足条件 ...
有的CPU支持散转,把转移地址排一排,一条BRX(XXXX)指令就解决了
苏联小苹果 发表于 2015-6-27 00:13
刚看了下汇编,switch case 中每个case是一个lable, 第一次进入某个lable后执行到while()然后不满足条件 ...
这样写代码极为蛋疼,我前面说了,有炫技成分。
而且早期C编译器比较简陋,很多不好的情况都放过去了,现在多半要发警告。
不规范的做法不值得提倡。
以前的CPU指令不够丰富,这样做情有可原,但也仅仅是历史原因。
壮东风 发表于 2015-6-27 09:30
这样写代码极为蛋疼,我前面说了,有炫技成分。
而且早期C编译器比较简陋,很多不好的情况都放过去了, ...
换个角度来说,炫技的往往都很精到~
e8098 发表于 2015-6-27 09:35
换个角度来说,炫技的往往都很精到~
C语言每年都有炫技大赛。。。
编码还是要看主流的。
C语言每年都有炫技大赛。。。
编码还是要看主流的。
跳转少的memcpy。如果体系结构支持multi-load/store,如powerpc,arm,用汇编实现才是效率最高。
netxiao1 发表于 2015-6-26 14:56
do while是日后再说,  while是看情况再日
高,实在是高。。。。
看着像c语言实现协程
好多码农啊
写那么麻烦,其实就实现了一个简单的功能:将from指针指向的空间之后的第(count-1)个空间里的内容复制到to指针所指向的空间。
此函数等价于:
int send_02(register short *to,register short * from,register int count){
  *to=*(from+count-1);
}
原函数还有一个BUG,那就是count必须大于0,否则会得到作者不想得到的结果。
swz2011 发表于 2015-6-28 10:08
写那么麻烦,其实就实现了一个简单的功能:将from指针指向的空间之后的第(count-1)个空间里的内容复制到to ...
这样不对吧,只复制了一个short。
壮东风 发表于 2015-6-28 10:13
这样不对吧,只复制了一个short。
case里没有break,外面是一层do-while,显然是复制了count次。
只是我不知道作者为什么要用do-while,用while等价于*to=*(from+count-1);用do-while其实等价于*to=count?*(from+count-1):*(from+7);

swz2011 发表于 2015-6-28 10:20
case里没有break,外面是一层do-while,显然是复制了count次。
只是我不知道作者为什么要用do-while,用w ...


while循环了大致count/8次,目的就是为了减少循环次数,再变态点count/16。。。
*to=*(from+count-1); 你这样做不就是复制了最后一个short么?
do {} while()是有道理的,因为do {不会翻译成汇编,也就不影响swich的结构。
swz2011 发表于 2015-6-28 10:20
case里没有break,外面是一层do-while,显然是复制了count次。
只是我不知道作者为什么要用do-while,用w ...


while循环了大致count/8次,目的就是为了减少循环次数,再变态点count/16。。。
*to=*(from+count-1); 你这样做不就是复制了最后一个short么?
do {} while()是有道理的,因为do {不会翻译成汇编,也就不影响swich的结构。
壮东风 发表于 2015-6-28 10:23
while循环了大致count/8次,目的就是为了减少循环次数,再变态点count/16。。。
*to=*(from+count-1); ...
源程序里复制了count次,但to指针一直没变,所以只是最后一次赋值有效。
while循环是可以放在switch里的,至少gcc可以编译通过。
swz2011 发表于 2015-6-28 10:36
源程序里复制了count次,但to指针一直没变,所以只是最后一次赋值有效。
while循环是可以放在switch里的 ...
可能程序写错了,否则只赋值一次,搞这么复杂没什么意义。
写这个代码的人堪称项目组里面的毒瘤
壮东风 发表于 2015-6-28 10:51
可能程序写错了,否则只赋值一次,搞这么复杂没什么意义。
作者想写的应该是*to++=*from++。