中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档 | 网通镜像
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > C/C++
这个只有两行的C程序至少有80%的人会判断错,不信的就进来!
作者:未知 时间:2005-09-13 19:18 出处:ChinaUnix.net 责编:chinaitpower
              摘要:这个只有两行的C程序至少有80%的人会判断错,不信的就进来!

#include<stdio.h>
void main()
{
    char *ptr = "csdn";
    printf( "%c\n",*(ptr++) ;
}

结果是什么,不许用编译器,看题后5秒钟内开始回答,还要说出原因

 HopeCao 回复于:2003-02-24 17:27:29
#include<stdio.h>
void main()
{
    int i = 10;
    i << 1;
    i >> 5;
    printf( "%d\n", i);
}

结果是什么,不许用编译器,看题后5秒钟内开始回答,还要说出原因.

 JohnBull 回复于:2003-02-24 17:33:26
[quote:c7f6fe9a1c="HopeCao"]#include<stdio.h>
void main()
{
    int i = 10;
    i << 1;
    i >> 5;
    printf( "%d\n", i);
}

结果是什么,不许用编译器,看题后5秒钟内开始回答,还要说出原因.[/quote:c7f6fe9a1c]

10

 

 xuejm 回复于:2003-02-24 17:52:05
第一段代码
10

第二段代码:
c

 菜青虫 回复于:2003-02-24 22:25:18
[quote:f7a8ff7b78="HopeCao"]#include<stdio.h>
void main()
{
    char *ptr = "csdn";
    printf( "%c\n",*(ptr++) ;
}

结果是什么,不许用编译器,看题后5秒钟内开始回答,还要说出原因[/quote:f7a8ff7b78]
s

 菜青虫 回复于:2003-02-24 22:25:44
[quote:44c1787fd6="HopeCao"]#include<stdio.h>
void main()
{
    int i = 10;
    i << 1;
    i >> 5;
    printf( "%d\n", i);
}

结果是什么,不许用编译器,看题后5秒钟内开始回答,还要说出原因.[/quote:44c1787fd6]
1

 xingli_nari 回复于:2003-02-25 08:51:15
10,i的值不会变的.

 menp9999 回复于:2003-02-25 09:22:02
[quote:2c35ead25e="菜青虫"]
s[/quote:2c35ead25e]
我也觉得s,因为有(),所以先算++,再算*.

 ksc 回复于:2003-02-25 09:29:59
i agree xuejm

 menp9999 回复于:2003-02-25 09:30:21
[quote:23a641d57c="HopeCao"]#include<stdio.h>
void main()
{
    int i = 10;
    i << 1;
    i >> 5;
    printf( "%d\n", i);
}

结果是什么,不许用编译器,看题后5秒钟内开始回答,还要说出原因.[/quote:23a641d57c]
你这题目出的有问题呀,这个在不同的机器上有不同的答案.要看移位补什么.
还要看I是用什么码表示的.

 unicorns 回复于:2003-02-25 10:16:42
agree with menp9999

 horse 回复于:2003-02-25 11:02:43
第一个输出“S”,原因是*(ptr++)加上括号后++运算后再取指针;
   第二个输出"10",i的值不变;

 zhutr 回复于:2003-02-25 11:07:30
第一个是c,ptr++是在语句执行完后才执行++操作的,有没有括号都一样。
第二个是10,单独的没有赋值的移位操作是不会改变原数大小的。
    如果改成i=i<<1;i=i>>5;的话,结果就是0了。

 horse 回复于:2003-02-25 11:16:55
第一个应该是"c",不好意思!

 horse 回复于:2003-02-25 11:17:19
第一个应该是"c",不好意思!

 stanleylei 回复于:2003-02-25 11:18:56
第一段代码是c
第二段代码是10

 menp9999 回复于:2003-02-25 11:33:23
[quote:257917773c="zhutr"]第一个是c,ptr++是在语句执行完后才执行++操作的,有没有括号都一样。
第二个是10,单独的没有赋值的移位操作是不会改变原数大小的。
    如果改成i=i<<1;i=i>>5;的话,结果就是0了。[/quote:257917773c]
为什么加()号不能改变运算优先级?能说明一下么?
实际就是说++有特殊的用法,
*(ptr++)<>*(ptr+1),是不是这个意思.我找了一下资料,没有找到解释的说明.

 杀人名医 回复于:2003-02-25 11:58:09
1 c
    机器里输出的

 jzsun 回复于:2003-02-25 12:46:05
其实这两个题是考对C的理解的。答案应该是C,10.
第一题:我们都知道++是什么意思,那么加括号了就会改变吗?我们知道PTR++,的意思是先用,用了再加一,这个例子中我们怎么用的?就是来取值用,用完了之后才完成加一的。
第二个,大家也都明白>> <<这两个运算符,但我们不要忘记了,C语言做位移运算是要将数据拷入到寄存器中来运算的,他不可能就在数据的本身上直接做运算的,如果那样的话,其不是要乱了套了。所以两道题的答案应该是C,10

 bombbaby 回复于:2003-02-25 13:07:08
1.   c 因为是++在后面的话,传递过去的是本身 的值。
2。 10,移位操作并不影响本身的值。

 zhutr 回复于:2003-02-25 14:19:31
[quote:37405b8265="menp9999"]
为什么加()号不能改变运算优先级?能说明一下么?
实际就是说++有特殊的用法,
*(ptr++)<>*(ptr+1),是不是这个意思.我找了一下资料,没有找到解释的说明.[/quote:37405b8265]

是的,*(ptr++) != *(ptr+1),
后面的那个表达式确实由于括号的原因改变了优先级,从而应该输出s,
但后缀加运算的规则是不同的,有一个简单的例子,
for(i=0;i<n;i++)
{
     printf("%d\n",i);
}
输出一定是0-9吧,换一种写法,
for(i=0;i<n;(i++))
{
     printf("%d\n",i);
}
这是会是什么情况呢?还是0-9,不可能变成1-10的。

其实原因就是,后缀加语句在一个复合语句中的时候,
一定是先使用变量的值,然后再进行加1操作的。
以上是我自己对C的理解,暂时无法提供更好的参考资料,
要是有不当的地方还请见谅。

 JohnBull 回复于:2003-02-25 15:21:28
[quote:911dfd6d3c="menp9999"]
为什么加()号不能改变运算优先级?能说明一下么?
实际就是说++有特殊的用法,
*(ptr++)<>*(ptr+1),是不是这个意思.我找了一下资料,没有找到解释的说明.[/quote:911dfd6d3c]

从编译原理上说,n++运算的语法定义恐怕是(yacc语法示意):
[code:1:911dfd6d3c]
{val}'+''+' :{$$=$1;$1=$1+1}
;
[/code:1:911dfd6d3c]
加不加()不影响表达式的值。

 bombbaby 回复于:2003-02-25 16:03:06
应该是加了(),主要是为了和*ptr ++,区别。

 ccc 回复于:2003-02-25 17:52:19
呵呵,(1)我的答案是c或s,让编译器决定。

我觉得这样的巧题,冷题很有意思,希望多看到。另一方面我觉得不必太认真,钻牛角尖。 就算答对了,它对解决实际问题有多大帮助呢?如果换个角度看,太容易引人出错,这难道不是C的一大缺陷吗?Java完全取消指针,大概就是因此吧。

 jzsun 回复于:2003-02-25 18:55:17
[quote:fafee7154e="JohnBull"]加不加()不影响表达式的值。[/quote:fafee7154e]
不错,解释的有道理

 mwatt 回复于:2003-02-26 13:14:23
ptr++,先返回ptr 的值然后+1,和括号没有关系,

 flw 回复于:2003-02-26 15:43:25
之所以加括号是为了和 *ptr++ 区分开,因为 *ptr++ 的意思是:
先使用 ptr 所指向的值(就是 *ptr ),然后再将 *ptr 加一。

 sunpk 回复于:2003-02-26 16:28:33
BB

 思考中。。。 回复于:2003-02-26 16:57:55
#include<stdio.h> 
void main() 

char *ptr = "csdn"; 
printf( "%c\n",*(ptr++) 

谁要是如此用 char *ptr = "csdn";,他的老师哭死了!

 wwjxjtu 回复于:2003-02-26 21:01:24
很显然第一个是 c ,ptr++是一个表达式,执行完之后,表达式的值不变,ptr增加一,与之不同的是++ptr,而者都增加一。
第二个是 10
表达式的值变了,但 i 的值没有改变!!
so  so..soooooo
so easy!!

 torrent 回复于:2003-02-28 10:37:48
[quote:ea512df568="思考中。。。"]#include<stdio.h> 
void main() 

char *ptr = "csdn"; 
printf( "%c\n",*(ptr++) 

谁要是如此用 char *ptr = "csdn";,他的老师哭死了![/quote:ea512df568]

不能这么说,程序是可以千变万化的;程序的技巧虽然重要,但是最重要的还是容错性!

 ohwww 回复于:2003-02-28 21:53:58
学习

 leaway 回复于:2003-03-22 23:13:02
哈哈,我都作错了!!看到了自己的不足,也向各位学到了不少东西。
特别感谢那几位给出答案,并且给出解释的朋友!!!
向你们学习!!!

 Elite 回复于:2003-03-23 16:37:33
学无止境

 wangz 回复于:2003-03-24 13:29:51
同意zhutr 的结果与原应。
向zhutr 致敬!

 jourmen 回复于:2003-03-24 19:57:41
其实第一个代码[code:1:7b5a5693ea]
#include<stdio.h> 
void main() 

char *ptr = "csdn"; 
printf( "%c\n",*(ptr++) );     /*here 等于printf( "%c\n",*ptr++);*/  
} [/code:1:7b5a5693ea] 
因为*.++处于同一优先级14级,改级的结合方向是  右-->左,++比*先来做,所以括号不要了.
第二个,不懂了,那位给我解释一下下.thx

 鸵鸟 回复于:2003-03-31 00:22:16
[quote:b185666a7e="menp9999"]
为什么加()号不能改变运算优先级?能说明一下么?
实际就是说++有特殊的用法,
*(ptr++)<>*(ptr+1),是不是这个意思.我找了一下资料,没有找到解释的说明.[/quote:b185666a7e]

 这个问题我觉得有点特殊,但也不是太难理解。其实我们将问题看远点,并不是加()不能改变运算优先级,*(ptr++)的加 “1” 是在调用了
 *ptr 之后将自身加“1”的,下回用,甚至是到下这一语句中出现也是,*ptr就是指向上次的数据的下一个数据的地址了,

 比如有这样子的一语句:(char *ptr="123";)

 [code:1:b185666a7e] if (*ptr++)  t=*ptr;[/code:1:b185666a7e]

 语句执行完后 t 是什么?? 也许你会说是 ‘1’ ,不是,t 应该是‘2’,你说是么?menp9999。

 *(ptr++)<>*(ptr+1)  是不成立的,只是运行之后 最大的要点就是
ptr 应该指向哪个数据的问题了。不防运行一下这个:
[code:1:b185666a7e]#include<stdio.h>
void main()
{char *ptr="123456";
 int i;
 if (*(ptr++)!=*(ptr+1)) i=1;
     else i=0;
printf( "%d\n", i);
}  
[/code:1:b185666a7e]

 鸵鸟 回复于:2003-03-31 00:24:21
上面后面的那个程序是个检测程序。

 鸵鸟 回复于:2003-03-31 00:39:49
 
[color=green:a16589d147]*(ptr++)<>*(ptr+1) 是[/color:a16589d147][color=red:a16589d147]不[/color:a16589d147][color=green:a16589d147]成立的,只是运行之后 最大的要点就是 
ptr 应该指向哪个数据的问题了。不防运行一下这个:[/color:a16589d147]

 不好意思啊!那个"不"字是我多打了,差点说错了,

 也就是说,*(ptr++)<>*(ptr+1)  应该是成立的,在这两个ptr是这样子写的时候: *(ptr++) 是不会等于*(ptr+1) [/quote]

 ygzq 回复于:2003-03-31 07:00:41
belong to the 80%

 Savagechen11 回复于:2003-03-31 15:17:27
第一个显然是c嘛,++是执行完*操作后才执行的

 鸵鸟 回复于:2003-03-31 22:51:19
[quote:5816a6f597="ygzq"]belong to the 80%[/quote:5816a6f597]

 这位大虾,,请说清楚点,我是那里错了,?

 sky_007 回复于:2003-04-09 11:27:20
如果用++ptr不就是c了吗?
而int  *ptr=10;是指向常量的,常量当然不能变量了!

 preferlinux 回复于:2003-04-16 13:49:58
可以这样理解++ :

++i 相当于:

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

而 i++ 相当于:

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

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

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

 tiansgx 回复于:2003-04-16 17:29:49
有意思。

 yantong 回复于:2003-05-05 09:55:39
老谭的书里很详细的说了*(p++)和*(++p)的区别
前者先取p值做*运算,然后p再自加1
后者是p先加1,然后再取*p

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

 yantong 回复于:2003-05-05 18:16:22
[quote:424227117f="思考中。。。"]#include<stdio.h> 
void main() 

char *ptr = "csdn"; 
printf( "%c\n",*(ptr++) 

谁要是如此用 char *ptr = "csdn";,他的老师哭死了![/quote:424227117f]


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

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

 wufanboy 回复于:2003-05-14 14:32:46
如果改成这样呢:
#include<stdio.h> 
void main() 

int i = 10; 
i << 1; 
i=i+i >> 5;
printf( "%d\n", i); 
}

 teddyboy121 回复于:2003-06-13 11:53:44
关于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)没有性能上的任何区别!

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有