当前位置:编程学习 > C#/ASP.NET >>

公布答案:考考准备面试的兄弟姐妹几个C#问题,看看你们是否够格“精通C#”

--------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答--------------------
我先去前个帖子好好看看题目。。。。 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 几个理解误区(比如readonly关键字)现在清楚了。谢谢楼主 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- (1)if的二义性悬挂问题,我们看如下代码:

C# code

    int i = 3, j = 5; if (i < j) if (i > j) j++; else i++; Console.WriteLine("i = {0}, j = {1}.", i, j);


不幸的是,输出的结果是i = 4, j = 5.原因是,编译器不会理睬你的缩进,在C#里,它会尽可能相邻的if-else。

几乎所有的教材都是这样说的:else 和最近的if匹配,结果理所当然的是 i=4,j=5.
我是菜鸟,还是不懂楼主说的二义性 --------------------编程问答-------------------- 学习了....
做错几道....
高级的就不做了...
--------------------编程问答-------------------- --------------------编程问答--------------------  神马都是浮云 给力 --------------------编程问答-------------------- --------------------编程问答-------------------- 呃..其他的我不怎么知道..不过关于第一题!LZ貌似有点...呵呵...代码编辑器里貌似会自动给你格式化成如下代码吧

            if (i > j)
                if (i < j)
                    i = 1;
                else
                    j = 1;

编辑器的缩进和你所给的不一样吧...这个二义性是你人为给出的一个错误定义... --------------------编程问答-------------------- --------------------编程问答-------------------- 学习了,做对了几题 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 好想知道什么是二义性........ --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答--------------------
引用楼主 geekbench 的回复:
感谢大家的支持。

题目大多是手写的,有一些瑕疵,为了对大家负责,这次我几乎全部运行验证了一次。

(1)if的二义性悬挂问题,我们看如下代码:
C# code
int i = 3, j = 5;
if (i < j)
    if (i > j)
        j++;
else
    i++;
Console.WriteLine("i = {0}, j = {1}.", i, ……

第一题在JS里执行结果也一样,编译原理相同,结果也为:i为4,j为5 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- public string Name { get; set; }
依我看那是你对C#语法误解。或者是没有遵循类,及属性定义规则。
要定义一个只读的属性是这样定义的么?  你自己使用矛盾的定义,去忽悠编译器。 这叫抬杠和钻牛角尖。
哈哈。 --------------------编程问答-------------------- int i = 3, j = 5;
if (i < j)
    if (i > j)
        j++;
else
    i++;
Console.WriteLine("i = {0}, j = {1}.", i, j);

这个好像不是缩进的问题吧,貌似,如果一个IF如果不加大括号的话,它只识别if下的第一句,如果有else的话,if和Else中间有2句以上的代码,就会报错,如果是你这种情况,他是直接识别到里面的那个if下了,就认为是里面if的else,就会认为你最外围的if后面没有任何处理。也就是说认为你的两个if是同一个级别的吧 --------------------编程问答-------------------- if (i > j)
                if (i < j)
                    i = 1;
                else
                    j = 1;

这个等同于
if (i>j)
{
    if (i < j)
        i = 1;
    else
        j = 1;
}
你自己理解错误了。根本不关缩进的事,再简化一点就行于:
if(i>j)
{
  console.writeLine("你理解错了!里面的 if ... else 实际上等同于一行代码")
} --------------------编程问答-------------------- 你定义了一个只读的类的引用,又没有定义类的只读属性,所以类的属性一样能改。  --------------------编程问答--------------------
引用 14 楼 kingdom_0 的回复:
(1)if的二义性悬挂问题,我们看如下代码:

C# code

  int i = 3, j = 5; if (i < j) if (i > j) j++; else i++; Console.WriteLine("i = {0}, j = {1}.", i, j);


不幸的是,输出的结果是i = 4, j = 5.原因是,编译器不会理睬你的缩进,在C#里,它会尽可能相邻的if……
对于14楼,只要将语句添些括号,你就能将架构看清楚了!
正常的应该正确的架构应该是
int i = 3, j = 5;
if (i < j)

    if (i > j)
        j++;
     else
       i++;

而有些人理解为
int i = 3, j = 5;
if (i < j)

    if (i > j)
        j++;
 }
else
    i++;
虽然下面这种理解错误,可是也能得出正确的结果!
所谓二义性,就是这个else可能导致这两种理解!
--------------------编程问答-------------------- --------------------编程问答-------------------- int i = 3, j = 5;
if (i < j)
  if (i > j)
  j++;
else
  i++;
Console.WriteLine("i = {0}, j = {1}.", i, j);

这个好像不是缩进的问题吧,貌似,如果一个IF如果不加大括号的话,它只识别if下的第一句,如果有else的话,if和Else中间有2句以上的代码,就会报错,如果是你这种情况,他是直接识别到里面的那个if下了,就认为是里面if的else,就会认为你最外围的if后面没有任何处理。也就是说认为你的两个if是同一个级别的吧 --------------------编程问答-------------------- --------------------编程问答-------------------- zhichi
--------------------编程问答-------------------- --------------------编程问答-------------------- 楼之很给力 --------------------编程问答-------------------- --------------------编程问答-------------------- 谢谢楼主了 --------------------编程问答-------------------- 原来如此。。。 --------------------编程问答-------------------- 谢谢楼主公布答案 --------------------编程问答-------------------- 原来如此 --------------------编程问答-------------------- 原来如此 --------------------编程问答-------------------- --------------------编程问答-------------------- 这个是二义性么…… --------------------编程问答-------------------- 学习了,
二义性?不是很理解 --------------------编程问答-------------------- --------------------编程问答-------------------- 这个有点奇怪,我理解的二义性好像不是这个意思啊? --------------------编程问答--------------------
引用 57 楼 fk1984316 的回复:
学习了,
二义性?不是很理解
歧义,明白?? --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 我先去前个帖子好好看看题目。。。。 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- 第9题自己体会不了,求解释,难道是因为先找的是D的foo方法,一看参数匹配了,就不去找别的重载方法了吗? --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- bool b1 = foo(1), b2 = foo(2);
if (b1 || b2)
{
    ...
}


||是如果b1 = true的话后面的不判断了,希望都判断是|而不是|| --------------------编程问答-------------------- --------------------编程问答-------------------- 我还是先先看看问题是什么吧 --------------------编程问答-------------------- --------------------编程问答-------------------- 给下分谢谢。。。 --------------------编程问答-------------------- 楼主是对社会有贡献的人,顶起! --------------------编程问答-------------------- --------------------编程问答-------------------- 看来小弟我还得闭门学习啊,差太多了 --------------------编程问答-------------------- xuexi l  --------------------编程问答-------------------- --------------------编程问答-------------------- 看到第一个问题就不想再往下看了,我觉得,这种不按照规范去写,在不同环境下会得到不同结果的问题,应该被鄙视和抛弃。

如果你是老板,看到员工那么写代码,不扣他工资? --------------------编程问答-------------------- --------------------编程问答-------------------- 答案对照了一下.... --------------------编程问答-------------------- 楼主是个有意思的人啊
--------------------编程问答-------------------- 编译原理当中的"二义性",是站在文法的角度分析的. --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答-------------------- bool b1 = foo(1), b2 = foo(2);
if (b1 || b2)
{
  ...
}
第二个可以用参数化解决(params int[] i) --------------------编程问答-------------------- 哦,原来是这么回事啊,受教了 --------------------编程问答-------------------- mark..........面试题???soga --------------------编程问答-------------------- 哈哈……还是能搞定一点的嘛,good…… --------------------编程问答-------------------- 抱歉楼主我不得不说看了第一题我就想说你出题没有一点水平。
什么悬挂二义性?
else和他最近的if语句匹配是必然的。

如果你想表达你的逻辑正确,就应该用规范的格式去书写你的代码,
if()
{
    if()
}
else
{
}

而不能指望编译器去根据你的缩进猜测你的逻辑。这是代码优秀与否的基本常识。这样的缩进式是什么?带有逻辑漏洞的缩进无非就是偷懒。 --------------------编程问答-------------------- 这个帖子推荐真是不负责任...明显是误导新人的,竟然还有这么多人“学习”...

1.楼主自己逻辑混乱,干编译器P事儿...

2.MSDN讲得清清楚楚...短路逻辑比较运算和逻辑运算根本就是两码事...

3.MSDN讲得清清楚楚...只读属性和readonly修饰符根本就是两码事...

别的没看原帖就不说了...别再误导新人了,撤掉推荐吧... --------------------编程问答--------------------
引用 97 楼 vrhero 的回复:
这个帖子推荐真是不负责任...明显是误导新人的,竟然还有这么多人“学习”...

1.楼主自己逻辑混乱,干编译器P事儿...

2.MSDN讲得清清楚楚...短路逻辑比较运算和逻辑运算根本就是两码事...

3.MSDN讲得清清楚楚...只读属性和readonly修饰符根本就是两码事...

别的没看原帖就不说了...别再误导新人了,撤掉推荐吧...

大侠 --------------------编程问答-------------------- --------------------编程问答--------------------
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,