人无信不立/2008-04-26 22:30

这样的面试题你会吗?

今天一个学生去面试.NET的软件工程师,面试题有这么一道:
short s=0;
s = s + 1;


short s=0;
s += 1;


这两个表达式有什么区别,会报什么错误?

学生不会,我也不会,我的第一反应是这两个语句好像没有什么错误呀,也没什么区别的。

结果在VS2005中一试,第一个编译报错,第二个没有问题。

真的蛮奇怪的,而且觉得出这种面试题的公司也蛮奇怪的

我的理解:
s = s + 1; 由于 1 默认是int型的,s是short的,"s+1"的结果默认是int的,把int的结果赋值给short时会报错,损失精度了,必须写成 s = (short)(s+1) 来强制转化一下

s+=1; 在编译时已经明确最后要赋值给s,即short型的,所以会在内部自动进行转换的 (不知哪位有更好的解释)
posted @ 2007-11-28 15:22 永春 阅读(4619) 评论(73)  编辑 收藏 所属分类: .Net

  回复  引用  查看    
#1楼 2007-11-28 15:26 | zeus2      
博主对了。自动转换一般从低的往高的转换,所以第一个会报错。
  回复  引用  查看    
#2楼 2007-11-28 15:29 | zeus2      
另外++的过程是
type & operator ++(int);
type & operator +=(int);

  回复  引用  查看    
#3楼 2007-11-28 15:31 | Cure      
怎么有弹出窗口??
  回复  引用  查看    
#4楼 2007-11-28 15:37 | 韩现龙      
--引用--------------------------------------------------
zeus2: 另外++的过程是
type & operator ++(int);
type & operator +=(int);

--------------------------------------------------------
小弟才疏学浅,没明白您的意思.详细给解释一下好么?
  回复  引用  查看    
#5楼 [楼主]2007-11-28 15:39 | GSpring      
@Cure
没有弹出窗口呀。是不是你点了什么链接
我是有google的广告-_-,不过不点的话应该不会弹出的呀,我是IE6
  回复  引用  查看    
#6楼 2007-11-28 15:46 | 瑞克      
两个short相加直接赋值给short也会报错的.

clr只支持int , native int , int64, float 进行四则运算.
堆栈里面的数字最小也是4字节的.

  回复  引用    
#7楼 2007-11-28 15:46 | 言 [未注册用户]
我也弹出窗口了 。。。。
  回复  引用  查看    
#8楼 2007-11-28 15:47 | 瑞克      
弹出窗口是楼主挂的广告.
  回复  引用  查看    
#9楼 [楼主]2007-11-28 15:49 | GSpring      
--引用--------------------------------------------------
zeus2: 另外++的过程是
type & operator ++(int);
type & operator +=(int);

--------------------------------------------------------

这个一般是C++中操作符重载的时候用的
short在c#中对应struct 的 Int16类型的,属于基础类型的
  回复  引用  查看    
#10楼 2007-11-28 15:50 | 装配脑袋      
Dim s As Short = 0S
s = s + 1S
  回复  引用    
#11楼 2007-11-28 15:50 | 路西菲尔 [未注册用户]
有弹出窗口,我是在firefox下.

这种面试题有什么意义,写代码的时候看见编译错误改了不就ok了.就算会这种几角旮旯的东西就能编好软件?
  回复  引用  查看    
#12楼 2007-11-28 15:50 | zeus2      
以下赋值语句将产生一个编译错误,原因是赋值运算符右侧的算术表达式在默认情况下的计算结果为 int 类型。

short z = x + y; // Error: no conversion from int to short

若要解决此问题,请使用强制转换:

short z = ( short )(x + y); // OK: explicit conversion

但是,在目标变量具有相同或更大的存储大小时,使用下列语句是可能的:

  回复  引用  查看    
#13楼 2007-11-28 15:51 | t-mac.NET      
没有弹出窗口




  回复  引用  查看    
#14楼 2007-11-28 15:53 | 装配脑袋      
C#竟然缺乏short型字面量支持。
  回复  引用  查看    
#15楼 2007-11-28 15:54 | S.Sams      
是有窗口弹出.
  回复  引用  查看    
#16楼 [楼主]2007-11-28 15:56 | GSpring      
@路西菲尔
我也是认为这种面试题没什么意思的
  回复  引用  查看    
#17楼 2007-11-28 15:57 | flower.b      
自动弹出广告!
  回复  引用  查看    
#18楼 [楼主]2007-11-28 15:57 | GSpring      
@S.Sams
关于弹出窗口的问题,请不要再发表评论了
可能是浏览器或者什么其他问题导致的,我用的IE6是没有弹出的

请大家多多讨论:为什么 s+=1 是可以的


谢谢
  回复  引用  查看    
#19楼 2007-11-28 16:00 | 阿牛      
s + 1, 双操作数运算, 把扩展成大的类型.

+= 是单操作数. 不用扩展

在C++里, += 是操作重写
  回复  引用  查看    
#20楼 2007-11-28 16:01 | 装配脑袋      
就像 s = 1可以编译通过一样,+=运算符可以自动识别右边的字面常量是否可以安全地转换为short。如果右边不是字面常量无论=还是+=都不可以的。

PS.我认为弹出广告的行为还是要严厉批评的,大家好不容易有个讨论的空间。
  回复  引用    
#21楼 2007-11-28 16:38 | G Spring [未注册用户]
@装配脑袋
我也是痛恨弹出窗口的行为的
我冤枉呀,我的IE6是没有弹出的,我在检查一下
  回复  引用  查看    
#22楼 2007-11-28 16:38 | 弘道      
有弹出窗口,我是在firefox下.
  回复  引用    
#23楼 2007-11-28 16:41 | cdgwel [未注册用户]
读操作数的位置时就有区别了,s+=1编译器只要对左边的s读就行了,而s=s+1是左右的s都要读的,编译器不知道两个s是一样的,所以说效率会不一样的.
  回复  引用  查看    
#24楼 2007-11-28 16:41 | JerryChou      
弹出来还不止一个,太无耻了
  回复  引用    
#25楼 2007-11-28 16:49 | 反弹窗者 [未注册用户]
--引用--------------------------------------------------
GSpring: @S.Sams <br />
<strong>关于弹出窗口的问题,请不要再发表评论了<img src="/CuteSoft_Client/CuteEditor/images/emteeth.gif" align="absMiddle" border="0" alt="" /><br />
可能是浏览器或者什么其他问题导致的,我用的IE6是没有弹出的<br />
<br />
请大家多多讨论:为什么 s+=1 是可以的</strong> <br />
<br />
<strong>谢谢</strong>
--------------------------------------------------------
敢做还不许人说?真是“没牙”哦!
博客园里你是第二个挂弹窗的,另外一个人至少他博客里有“弹窗联盟”几个红字提醒,也不往首页发文章。
不要再弹窗了,不然我让你在所挂的弹窗联盟里被列入“作弊黑名单”。

  回复  引用  查看    
#26楼 2007-11-28 16:50 | KKcat      
恩 ,平时没有注意。确实有弹出广告
  回复  引用    
#27楼 2007-11-28 17:04 | 小宇?? [未注册用户]
我感觉考这个没啥用.....

虽说是考基础知识吧,虽然在VS里报错,但我感觉这个不算语法错误的.1也可以是short型嘛.
  回复  引用    
#28楼 2007-11-28 17:13 | 伊人随风 [未注册用户]
反对,有自动弹出广告!
  回复  引用  查看    
#29楼 2007-11-28 17:14 | henry      
访问cnblog首页提示
http://pagead2.googlesyndication.com

访问楼主提示
http://mccannafa7.allyes.com
http://pagead2.googlesyndication.com

这样的题根本没有意义,这是编译器制如此 short == int16
  回复  引用  查看    
#30楼 2007-11-28 17:22 | Dove.Net      
有弹出窗口,广告
  回复  引用  查看    
#31楼 2007-11-28 17:23 | 随风流月      
InvaildCastException...
  回复  引用    
#32楼 2007-11-28 17:25 | gxpotato [未注册用户]
不知道出这道题的人怎么想的,我觉得,没有人会把整个C#完完全全的明白。专精的只是某个部分。如果刚好考的不是专精的部分,那么,对于企业来说是个损失。
  回复  引用    
#33楼 2007-11-28 17:25 | 路过 [未注册用户]
没有实际意义.
不如考
s++ 与++s

  回复  引用  查看    
#34楼 2007-11-28 17:29 | 亚历山大同志      
常识啊常识
  回复  引用    
#35楼 2007-11-28 17:29 | 晚安,北京 [未注册用户]
自动弹广告,鉴定完毕。
  回复  引用  查看    
#36楼 2007-11-28 17:31 | 森林鸟      
被骗了,有自动弹出广告
  回复  引用  查看    
#37楼 2007-11-28 17:40 | 米开朗基罗      
打开速度巨慢?
楼主没有挂马吧?怕.....
  回复  引用  查看    
#38楼 2007-11-28 17:45 | 代码乱了      
我试了几次,的确有弹出窗口
  回复  引用  查看    
#39楼 2007-11-28 17:47 | winnerzone      
为什么我进来要探出一个网页?
  回复  引用  查看    
#40楼 2007-11-28 17:57 | GoGoSonny      
难怪偶的FF上闪了下,原来有屏蔽的。。。
  回复  引用  查看    
#41楼 2007-11-28 17:57 | a feng      
“就像 s = 1可以编译通过一样,+=运算符可以自动识别右边的字面常量是否可以安全地转换为short。如果右边不是字面常量无论=还是+=都不可以的。

这句话好像道出了真正原因
  回复  引用    
#42楼 2007-11-28 19:03 | 欢乐的猪 [未注册用户]
我用FF, 有弹出窗口

这个问题很简单, C#如此定义的而已

s = s + 1 包括两个运算符, +和=, short + int 返回 integer, 再符给short,报错,

s+= 1 只有一个运算符, C#并不是把+=转化到+和=实现的,当然不会有这个问题。

另外,强烈鄙视弹窗行为
  回复  引用  查看    
#43楼 2007-11-28 19:12 | 装配脑袋      
LS的解释是不对的,只有+=照样可以编译错误:

int i = 0;
short s = 0;

s += i; //编译错误
  回复  引用  查看    
#44楼 2007-11-28 19:26 | 随风流月      
@装配脑袋
我在想,这里的编译错误可能源于 .net 担心万一 s = 65535...再加上 1,不就溢出了?
  回复  引用    
#45楼 2007-11-28 19:37 | hxling [未注册用户]
有弹出窗口,页面中有ACTIVEx

  回复  引用  查看    
#46楼 2007-11-28 20:18 | www.topyee.com      
IE6
确实弹出窗口了...
  回复  引用  查看    
#47楼 2007-11-28 20:43 | 紫色阴影      
晕死 有广告啊。。。
  回复  引用  查看    
#48楼 2007-11-28 23:45 | Michael Wang      
刚为了装vs2008重装的系统呀,千万别整个病毒啊晕...
  回复  引用    
#49楼 2007-11-29 01:49 | lulu [未注册用户]
IE6
确实有弹出广告!!
严重反对!!
  回复  引用  查看    
#50楼 2007-11-29 08:14 | 大口仔      
有时觉得面试的人都几无聊的,我也碰到过,好像专门想为难人的,实际用得多的东西不去问下,偏偏问些很不常见的东西,这种公司我觉得进了也没有多大用处呵呵
  回复  引用    
#51楼 2007-11-29 08:51 | longer [未注册用户]
楼主不厚道,弹一个窗口就好了,竟然还弹两个
  回复  引用  查看    
#52楼 2007-11-29 09:07 | xiaowy      
无知就是无知,有的人却偏偏会去为无知找很多理由
差之毫厘,失之千里
如果控制宇宙飞船的系统,其中有一个小数点错误,那将怎样?
企业不是学校..
demo和“产品”仅仅是名字之差吗?
面试的人都无聊?那他面试你的目的是什么?
很简单的逻辑,都不明白。凭什么相信你能写更复杂的程序。
很多时候细节决定成败
  回复  引用  查看    
#53楼 [楼主]2007-11-29 09:15 | GSpring      
首先对于弹出广告的问题,向各位表示歉意

不过前面也说过我也是痛恨弹出广告的,主观上我并不想弹出广告的。

我以前一直用IE6是没有弹出的,今天装了FF,确实会弹出http://pagead2.googlesyndication.com,后来我在管理-〉选项里面把"博客园广告(左下角)"的去掉之后就好了,这个好像是博客园的问题的

然后我也把原来左上角的google广告也去掉了

请各位朋友再帮忙看看,如果有弹出广告的请告诉我:
所用浏览器,弹出窗口的url

谢谢
  回复  引用    
#54楼 2007-11-29 09:41 | webqsoft [未注册用户]
--引用--------------------------------------------------
大口仔: 有时觉得面试的人都几无聊的,我也碰到过,好像专门想为难人的,实际用得多的东西不去问下,偏偏问些很不常见的东西,这种公司我觉得进了也没有多大用处呵呵
--------------------------------------------------------
不会就是不会
小地方搞不清楚,只能说基础不好

  回复  引用  查看    
#55楼 2007-11-29 10:30 | Enzo      
不会了
  回复  引用    
#56楼 2007-11-29 11:32 | kevin123 [未注册用户]
不会!!!但就这个问题,我不觉得会影响我的开发、设计。。。

也许当作面试题列出来,很多人好像都会,但是真正做的时候,不见得就注意到这个问题了。。。实际上我个人认为这种面试题没有太大的意义。。
  回复  引用  查看    
#57楼 2007-11-29 13:10 | 斧头帮少帮主      
我直接做这道题,就得交白卷...

PS:Maxthon没有弹出广告,完毕
  回复  引用    
#58楼 2007-11-29 13:52 | good [未注册用户]
出这种面试题的纯属脑子有病,说的严重了还请见谅
  回复  引用  查看    
#59楼 2007-11-29 13:56 | xiaowy      
一个浮躁的时代
  回复  引用  查看    
#60楼 2007-11-29 15:02 | Tony Qu      
这种题一点意义都没有,VS编译的时候本来就不会通过,这是在面编译器开发工程师:)
  回复  引用  查看    
#61楼 2007-11-29 17:39 | Autumoon      
很明显,低精度的数据类型不能隐式转换成高精度的。
  回复  引用  查看    
#62楼 2007-11-29 19:07 | 壁虎      
我的理解:
s=s+1 是+号运算符,会把s转换成int 再计算,然后将int 赋回short报错。

而s+=1;是单目的运算符,在+=的操作中,自动会进行强制类型转换。

也就是说是在赋值时报错。而不是运算时出错。

如果说现在还处在用记事本写代码的时代,可能是有意义的。
但是对于现在的程序开发,本人认为没有意义。
  回复  引用  查看    
#63楼 2007-11-30 01:16 | Soli      
现在知识越来越多了,想找个为难别人的问题越来越容易了,唉~~~
  回复  引用  查看    
#65楼 2007-11-30 08:07 | 卜尊尊      
这道题可以在java解惑谜题9:半斤中找到答案。
  回复  引用  查看    
#66楼 2007-11-30 10:03 | Ankrmi Wong      
在VB中如果要求严格检查:Option Strict On
那么不同类型之间必须显示转换。
如果关闭Option Strict ,这两个整数转换完全可通过。
难道C# 不同于 VB 2005?
  回复  引用  查看    
#67楼 2007-11-30 10:10 | Ankrmi Wong      
如果第1个编译出错,说明本身就是个overflow错误运算,只是C#在运行之前不提示这种错误,而vb会提示这种错误。
  回复  引用  查看    
#68楼 2007-12-02 09:40 | 航天奇侠      

个人感觉要人做编译器的事情挺无聊。

  回复  引用  查看    
#69楼 2007-12-25 11:20 | 隐姓埋名      
有点儿 意思!
  回复  引用  查看    
#70楼 2008-03-07 17:40 | 我们      
主要是操作符如何实现的问题。
  回复  引用  查看    
#71楼 2008-03-19 09:43 | 感動常在      
MSDN:

以下赋值语句将产生一个编译错误,原因是赋值运算符右侧的算术表达式在默认情况下的计算结果为 int 类型。

short z = x + y; // Error: no conversion from int to short

若要解决此问题,请使用强制转换:

short z = ( short )(x + y); // OK: explicit conversion

但是,在目标变量具有相同或更大的存储大小时,使用下列语句是可能的:
  回复  引用  查看    
#72楼 2008-03-21 13:06 | XiaoLin's Blog      
这道题在<.net2.0>实践这本书中有提及过!
  回复  引用  查看    
#73楼 2008-04-03 09:37 | 破曉之陽      
这个学生 面试通过了没。如果没有。那是因为没报上你大师的大名。嘿嘿。