标签: language-history

PHP中的大写布尔与小写

当我学习PHP时,我在某处读到你应该总是使用大写版本的布尔值,TRUE并且FALSE,因为"普通"小写版本,true并且false使用起来并不"安全".

它已经很多年了,我编写的每个PHP脚本都使用大写版本.但是,我现在质疑,因为我已经看到大量用小写版本编写的PHP(即Zend Framework).

是/有没有理由使用大写版本,还是完全可以使用小写?

编辑:忘了提及这适用于NULLnull.

php language-history

126
推荐指数
7
解决办法
3万
查看次数

Java的一元加运算符的目的是什么?

Java的一元加运算符似乎来自C,通过C++.

int result = +1;   
Run Code Online (Sandbox Code Playgroud)

它似乎有以下影响:

  • 如果它是包装器对象,则将其操作数取消装箱
  • int如果它不是已经int或更宽,则提升其操作数
  • 稍微复杂化包含大量连续加号的邪恶表达式的解析

在我看来,有更好/更清晰的方法来做所有这些事情.

这个SO问题中,关于C#中的对应运算符,有人说"如果你觉得有必要,它就会超载".

但是,在Java中,不能超载任何运算符.那么这个一元加运算符是否只存在于Java中,因为它存在于C++中?

java unary-operator language-history

36
推荐指数
3
解决办法
7020
查看次数

为什么C编译器将下划线添加到外部名称?

我已经在C工作了很长时间以至于编译器通常在一个开头添加一个下划线这一事实extern只是被理解......然而,今天另一个SO问题让我想知道为什么添加下划线的真正原因.一篇维基百科文章称,原因是:

C编译器的常见做法是在所有外部作用域程序标识符之前加上前导下划线,以避免与运行时语言支持的贡献发生冲突

我认为这至少有一个真实的核心,但它似乎并没有真正回答这个问题,因为如果将下划线添加到所有外部,它对防止冲突没有多大帮助.

有没有人有关于领先下划线的理由的良好信息?

增加的下划线部分原因是Unix creat()系统调用不以'e'结尾?我听说某些平台上的早期链接器名称限制为6个字符.如果是这种情况,那么将下划线添加到外部名称似乎是一个彻头彻尾的疯狂想法(现在我只有5个字符可以玩......).

c language-history

34
推荐指数
2
解决办法
9425
查看次数

替代 for 循环构造

一般评论:任何对这个问题提供新的有用见解的新答案都将获得奖励。


击参考手册提到击支持以下for循环结构:

for name [ [in [words ...] ] ; ] do commands; done
for (( expr1 ; expr2 ; expr3 )) ; do commands ; done
Run Code Online (Sandbox Code Playgroud)

令人惊讶的是,以下 for 循环结构也是有效的:

for i in 1 2 3; { echo $i; }
for ((i=1;i<=3;++i)); { echo $i; }
Run Code Online (Sandbox Code Playgroud)

这些不寻常的构造根本没有记录。无论是猛砸手册中,猛砸男子的页面,也不Linux文档计划使这些结构的任何提及。

在研究语言语法时,可以看到使用开闭大括号 ( { commands; }) 作为替代方案do commands; done是一种有效的构造,该构造适用于 for 循环和 select 语句,并且可以追溯到Bash-1.14.7 [1]

另外两个循环结构:

until test-commands; do …
Run Code Online (Sandbox Code Playgroud)

bash shell sh language-history language-lawyer

26
推荐指数
1
解决办法
1004
查看次数

"英雄单位"是什么意思?

术语"英雄"是什么意思,为什么它用来命名网站/页面的"主要信息"?

具体来说,我想知道术语"英雄"或短语"英雄单位"是否是我设法错过的网页设计中使用的一些常用术语.

language-history twitter-bootstrap

23
推荐指数
1
解决办法
4375
查看次数

Python:为什么int类没有像`__lt __()`那样丰富的比较运算符?

非常好奇.

我已经注意到了(至少在PY 2.6和2.7),一个float拥有所有熟悉的丰富的比较函数:__lt__(),__gt__,__eq__等.

>>> (5.0).__gt__(4.5)
True
Run Code Online (Sandbox Code Playgroud)

但是int没有

>>> (5).__gt__(4)
Traceback (most recent call last):
  File "<input>", line 1, in <module>
AttributeError: 'int' object has no attribute '__gt__'
Run Code Online (Sandbox Code Playgroud)

这对我来说很奇怪,因为运营商本身运作良好

>>> 5 > 4
True
Run Code Online (Sandbox Code Playgroud)

甚至字符串也支持比较功能

>>> "hat".__gt__("ace")
True
Run Code Online (Sandbox Code Playgroud)

但所有的int都是__cmp__()

对我来说似乎很奇怪,所以我想知道为什么会这样.

刚刚测试过,它在python 3中按预期工作,所以我假设有一些遗留原因.仍然希望听到正确的解释;)

python language-design language-history

21
推荐指数
2
解决办法
1318
查看次数

受C++启发的C#如何比Java更受启发?

在查看C#历史时,我发现C#被视为对C和/或C++的更新.这对我来说有点意外,表面上看,我看到C#和Java之间有更多常见的想法(想到垃圾收集).我不是用Java编写代码,但是我通常没有跟随Java代码的问题,并且经常阅读有关Java中我可以在C#中轻松转置的模式的书籍,并且老实说不能对C++说同样的话.
所以我的问题是,C#如何更接近C++而不是Java?这只是拒绝承认Java,还是我错过或误解了什么?

c# c++ java programming-languages language-history

20
推荐指数
8
解决办法
5735
查看次数

如何在Python中为静态方法选择语法?

我已经使用Python一段时间了,我发现将方法声明为静态的语法是特殊的.

将声明一个常规方法:

def mymethod(self, params)
   ...
   return
Run Code Online (Sandbox Code Playgroud)

声明了一个静态方法:

def mystaticethod(params)
   ...
   return
mystaticmethod = staticmethod(mystaticmethod)
Run Code Online (Sandbox Code Playgroud)

如果您不添加静态方法行,编译器会抱怨自我丢失.

这是一种非常简单的非常简单的方法,在其他语言中只需使用关键字和声明语法.谁能告诉我这种语法的演变?这仅仅是因为课程被添加到现有语言中吗?

由于我可以将staticmethod行移动到类的后期,因此它还表明解析器在簿记方面的工作量更大.

请注意,我知道稍后添加的装饰器语法,我很想知道从语言设计角度来看原始语法是如何产生的.我能想到的唯一想法是staticmethod应用程序调用一个将函数对象转换为静态方法的操作.

python syntax static language-history

14
推荐指数
2
解决办法
1014
查看次数

Perl版本中后向不兼容性的一些具体示例是什么?

Perl 1.0(1987年12月18日)的首次公开发布与目前的稳定版本5.10.1(2009)之间已有22年的历史.

在这22年中,发布了以下重要版本:

  • Perl 1.0(1987年 - 初版)
  • Perl 2(1988年 - 更好的正则表达式)
  • Perl 3(1989年 - 支持二进制数据流)
  • Perl 4(1991年 - 确定骆驼书中描述的Perl版本)
  • Perl 5(1994年 - 引入了重大更改,几乎完全重写了解释器)
  • Perl 5.6(2000 - 64位支持,unicode字符串,大文件支持)
  • Perl 5.8(2002年 - 改进的unicode支持,新的IO实现)
  • Perl 5.10(2007 - 新的switch语句,正则表达式更新,智能匹配运算符)

我正在寻找Perl历史中反向不兼容的具体示例.

题:

  • 在Perl的22年历史中,是否存在Perl向后不兼容的任何示例,其中针对Perl版本X的Perl源代码将不会在版本Y下运行(其中Y> X)?

请尽可能包含参考和代码示例.

perl compatibility backwards-compatibility language-history

12
推荐指数
4
解决办法
474
查看次数

朋友声明的复杂范围规则有什么意义?

我最近发现朋友声明范围遵循极其特殊的规则 - 如果你有一个friend函数或一个尚未声明的类的声明(定义),它会在直接封闭的命名空间中自动声明(定义),它是不可见的不合格和合格的查询; 但是,友元函数声明通过依赖于参数的查找保持可见.

struct M {
    friend void foo();
    friend void bar(M);
};

void baz() {
    foo();    // error, unqualified lookup cannot find it
    ::foo();  // error, qualified lookup cannot find it
    bar(M()); // ok, thanks to ADL magic
}
Run Code Online (Sandbox Code Playgroud)

如果你看一下标准(参见链接的答案),他们就会付出很大的代价来启用这种古怪的行为,在复杂规则的限定/非限定查找中添加一个特定的例外.最终的结果让我感到非常困惑1,还有另一个案例要添加到实现中.作为

  • 要求friend声明引用现有名称,期限; 要么
  • 允许他们像现在一样声明东西,但不改变普通的名字查找(因此,这样的名称变得可见,好像在封闭的命名空间中声明为"正常")

似乎更容易实现,指定,最重要的是,理解,我想知道:为什么他们为这个烂摊子烦恼?他们试图覆盖哪些用例?在任何这些更简单的规则下(特别是第二个与现有行为最相似的规则)会破坏什么?


  1. 例如,在这种特殊情况下

    struct M {
       friend class N;
    };
    N *foo;
    typedef int N;
    
    Run Code Online (Sandbox Code Playgroud)

    你得到可笑的精神分裂症错误信息

    <source>:4:1: error: 'N' does not name …
    Run Code Online (Sandbox Code Playgroud)

c++ friend language-history friend-function language-lawyer

11
推荐指数
1
解决办法
221
查看次数