导航
  • 主页
  • C#综合技术
  • C#互联网桌面应用
  • AppLauncher
  • WinForm
  • WPF
  • 问答

C#小游戏

Forty2 2016-08-29 09:13:59

代码很简单,单项选择A,B,C,能附上理由更佳。
请尽量回答后再上机验证:)

class Program
{
static void Main()
{
int a = 1, b = 2, c = 3;
System.Console.WriteLine("{0} {1}", a < b, c > (1 + 1) * 1.5, a, b, c);
}
}

/*
A: true false
B: true true
C: Visual Studio不知道如何编译。
*/
...全文
324 点赞 收藏 15
写回复
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
谢谢朋友们的参与。 答案是C,原因确如大家所讨论的,是泛型语法(大于号,小于号)造成的歧义,导致VS编译错误。 把a < b, c > (1 + 1) * 1.5 解释为泛型函数调用的例子如下:
class Program
{
    static void Main()
    {
        Console.WriteLine("{0} {1}", a<b, c>(1 + 1) * 1.5, "");  // 输出 30
    }

    static double a<T1, T2>(double d) { return 20; }
    class b { }
    class c { }
}
注一、 答案C也不是绝对准确。DotNet1.1还不支持泛型, Visual Studio .NET 2003可以通过编译并运行出答案A。 注二、 微软早知道该歧义(C++也有类似问题)。因为出现歧义的概率很小,而且可以用编译器来抱怨,他们还是选用了(大于号,小于号)作为泛型语法标志。
回复
dianjixue1 2016-08-30
原来结果是这样。3#,5#已将答案贴出......
回复
HerveyHall 2016-08-29
学习到了
回复
xian_wwq 2016-08-29
实践证明要确保表达式的正确性,()非常重要
回复
好吧。。。。。居然是无法编译…… 看来编译器判断泛型的优先级比较高
回复
bigbaldy 2016-08-29
b和c被当成泛型参数了
回复
A a<b这个不难理解,c > (1 + 1) * 1.5这个是整形与double型比较,整形会被强转为double型,而在强转后,一般会出现精度问题,即丢失精度,进而导致比同等值的double小,最终又回到了double比较方式是 Math.Abs(c- (1 + 1) * 1.5)<0.0001这种小于指定精度就认为正确的解决方案上来
回复
xuzuning 2016-08-29
C a < b, c > (1 + 1) * 1.5 < b, c > 被解释成了类型声明 编译器将其理解为在执行 a<b, c> (1 + 1) 方法 写作
System.Console.WriteLine("{0} {1}", (a < b), c > (1 + 1) * 1.5, a, b, c);
即可
回复
歧义句
回复
夏天的枫 2016-08-29
引用 2 楼 hjq624779687 的回复:
我把a<b改成了(a<b),结果是True Flase
按照原来的写法会报错。。。VS把a<b,c>看成一个单元了。
回复
夏天的枫 2016-08-29
我把a<b改成了(a<b),结果是True Flase
回复
哈哈,竟然会这样!!
回复
crystal_lz 2016-08-29
差点就上当选A了。。。。。。。。
回复
Poopaye 2016-08-29
选项应该这样写 A: true true B: true false C: false true D: false false
回复
Poopaye 2016-08-29
我选c
回复
发动态
发帖子
C#
创建于2007-09-28

10.4w+

社区成员

.NET技术 C#
申请成为版主
社区公告

全世界最好的语言,没有之一.