| 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)没有性能上的任何区别!
|