当前位置:  开发笔记 > 编程语言 > 正文

什么模糊的语法毁了你的一天?

如何解决《什么模糊的语法毁了你的一天?》经验,为你挑选了10个好方法。

你什么时候遇到可能过时的语法,从来没有使用或只是简单的混淆,你无法理解你的生活.

例如,我从来不知道逗号是C中的实际操作符.所以当我看到代码时

if(Foo(), Bar())

我只是吹了一个垫子试图弄清楚那里发生了什么.

我很好奇在其他语言中可能存在一些从不肮脏的小角落.



1> JaredPar..:

C++的局部变量默认构造函数的语法.起初我写了以下内容.

Student student();  // error
Student student("foo");  // compiles

这导致我通过一个神秘的C++错误消息阅读大约一个小时.最终一个非C++新手掉了下来,笑了起来,指出了我的错误.

Student student;


实际上C++在这方面非常一致 - 规则是"如果它可以以任何方式被视为声明,那么它就是一个声明"
这是纯粹的邪恶,它容易忘记
第一个不是错误,它声明了一个不带参数的函数并返回一个Student对象.该语法可以追溯到C.

2> Paul Becking..:

这总是很刺耳:

std::vector  >
                              ^
                              mandatory space.


它最终在c ++ 0x中变得合法.

3> Nicholas Pia..:

当使用System.DirectoryServices名称空间绑定到ADAM(Active Directory应用程序模式;我认为现在称为AD LDS)时,我整整一天都在尝试调试这个简单的代码:

DirectoryEntry rootDSE = new DirectoryEntry(
    "ldap://192.168.10.78:50000/RootDSE",
    login, 
    password, 
    AuthenticationTypes.None);

当我运行代码时,我不断收到COMException错误0x80005000,这有助于映射到"未知错误".

我可以使用登录名和密码并通过ADSI Edit绑定到端口.但是这个简单的代码行不起作用.奇怪的防火墙权限?有什么东西搞砸了?某些COM对象未正确注册?为什么它不起作用?

答案?它是LDAP://,而不是ldap://.

这就是我们喝酒的原因.


Active Directory和LDAP - 将大型机复杂性带到您的桌面!

4> strager..:

C++

class Foo
{
    // Lots of stuff here.
} bar;

宣言bar很难看.更常见于C语言,但在C++中尤其烦人.


我和代码审查一样.

5> Greg Hewgill..:

Perl的语法不久前给我带来了糟糕的一天:

%table = {
  foo => 1,
  bar => 2
};

如果没有适当的警告(在我使用的平台上不可用),这会创建一个单元素哈希,其中一个键作为给定的哈希引用和值undef.注意微妙的使用{},它创建一个新的哈希引用,而不是(),这是一个用于填充%table哈希的数组.


我想你可以用Perl对这个问题进行几百个回答.
Perl的语法总是给我带来糟糕的一天.

6> Jason Baker..:

我很震惊Python的准三元运算符在我第一次看到它时不是语法错误:

X if Y else Z


我仍然觉得它令人困惑,因为它会改变if-then-else to then-if-else.至少C风格的`?:`运算符保留了该顺序.

7> James Thomps..:

这是愚蠢和常见的,但这种语法:

if ( x = y ) {
    // do something
}

在过去的一年中,我用几种不同的语言抓住了我三次.我非常喜欢R语言使用< - 进行赋值的惯例,如下所示:

x <- y

如果x = y语法的意思是x == y,而x < - y意味着赋值,那么我的大脑将能够更平滑地过渡到数学和编程.


现代编译器会对以下情况发出警告:=是赋值表达式,==是比较运算符.你是对的,不幸的是,=通常用来表示破坏性的分配.Pascal有一个更好的主意:=.

8> JaredPar..:

C#的?第一次看到它时,操作员把我扔了一圈.基本上,如果LHS为非空,它将返回LHS,如果LHS为空则返回RHS.

object bar = null;
object foo = bar ?? new Student();  // gets new Student()



9> JaredPar..:

C/C++的bitvector语法.关于这个最糟糕的部分是试图谷歌只是基于语法.

struct C {
  unsigned int v1 : 12;
  unsigned int v2 : 1;
};



10> JaredPar..:

Powershell的函数调用语义

function foo() { 
  params ($count, $name);
  ...
}

foo (5, "name")

对于那里的非权力出租人.这将有效,但不是你期望的.它实际上创建了一个数组并将其作为第一个参数传递.第二个参数没有明确的价值.正确的版本是

foo 5 "name"

推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有