免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: HopeCao
打印 上一主题 下一主题

这个只有两行的C程序至少有80%的人会判断错,不信的就进来! [复制链接]

论坛徽章:
0
41 [报告]
发表于 2003-03-31 15:17 |只看该作者

这个只有两行的C程序至少有80%的人会判断错,不信的就进来!

第一个显然是c嘛,++是执行完*操作后才执行的

论坛徽章:
0
42 [报告]
发表于 2003-03-31 22:51 |只看该作者

这个只有两行的C程序至少有80%的人会判断错,不信的就进来!

[quote]原帖由 "ygzq"]belong to the 80%[/quote 发表:


 这位大虾,,请说清楚点,我是那里错了,?
sky_007 该用户已被删除
43 [报告]
发表于 2003-04-09 11:27 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
44 [报告]
发表于 2003-04-16 13:49 |只看该作者

这个只有两行的C程序至少有80%的人会判断错,不信的就进来!

可以这样理解++ :

++i 相当于:

int& int:perator++()
{
        *this +=1;
        return *this;
}

而 i++ 相当于:       

int& int:perator++(int)
{
        int oldValue = *this;
        ++(*this);
        return oldValue;
}

因此ptr++的返回值就是ptr。

而且从++的定义还可以看出:应该尽量用++i代替i++,这样可以提高效率。

论坛徽章:
0
45 [报告]
发表于 2003-04-16 17:29 |只看该作者

这个只有两行的C程序至少有80%的人会判断错,不信的就进来!

有意思。

论坛徽章:
0
46 [报告]
发表于 2003-05-05 09:55 |只看该作者

这个只有两行的C程序至少有80%的人会判断错,不信的就进来!

老谭的书里很详细的说了*(p++)和*(++p)的区别
前者先取p值做*运算,然后p再自加1
后者是p先加1,然后再取*p

而且*p++和*(p++)是等价的。

论坛徽章:
0
47 [报告]
发表于 2003-05-05 18:16 |只看该作者

这个只有两行的C程序至少有80%的人会判断错,不信的就进来!

原帖由 "思考中。。。" 发表:
#include<stdio.h>;
void main()
{
char *ptr = "csdn";
printf( "%c\n",*(ptr++) );
}
谁要是如此用 char *ptr = "csdn";,他的老师哭死了!



这样定义一个字符指针变量并且进行初始化是合法的,你在老谭的那本c语言教程的187页可以看到详解。这样赋值实际上是把字符串的首地址赋给ptr。他的老师不会哭死!

老谭是中国的c语言教父,呵呵

论坛徽章:
0
48 [报告]
发表于 2003-05-14 14:32 |只看该作者

这个只有两行的C程序至少有80%的人会判断错,不信的就进来!

如果改成这样呢:
#include<stdio.h>;
void main()
{
int i = 10;
i << 1;
i=i+i >;>; 5;
printf( "%d\n", i);
}

论坛徽章:
0
49 [报告]
发表于 2003-06-13 11:53 |只看该作者

这个只有两行的C程序至少有80%的人会判断错,不信的就进来!

关于printf("%c\n",*(ptr++)
我用MS VC编译器,汇编为如下
   004010E0   mov         eax,dword ptr [ebp-4]
004010E3   movsx       ecx,byte ptr [eax]
004010E6   mov         dword ptr [ebp-0Ch],ecx
004010E9   mov         edx,dword ptr [ebp-0Ch]
004010EC   push        edx
004010ED   push        offset string "%c\n" (00422040)
004010F2   mov         eax,dword ptr [ebp-4]
004010F5   add         eax,1
004010F8   mov         dword ptr [ebp-4],eax
004010FB   call        printf (00401950)
大家可以看到,压栈的值是EAX寄存器,压栈后EAX才加的,最后附到变量PTR上。
其实怎么调用(PTR++)和(++PTR)没有性能上的任何区别!

论坛徽章:
1
双子座
日期:2015-01-04 14:25:06
50 [报告]
发表于 2008-05-26 13:08 |只看该作者
这道题有意思
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP