该void
关键字仅用作返回类型,以指示方法不返回值.但是为什么不能void
在方法定义中用作形式参数来表明它不接受任何参数,例如:
void fun(void){
...
}
Run Code Online (Sandbox Code Playgroud) 整数数据[3][5];
是 5 元素数组的 3 元素数组。
为什么?对我来说,直觉上 ifint[3]
是一个 3 元素数组,而int[3][5]
应该是3 元素数组的 5 元素数组。
在阅读 Python\xe2\x80\x99s执行模型文档时,我意识到 Python\xe2\x80\x99s 自由变量似乎没有严格的后期绑定属性,其中任何代码块中发生的名称绑定都可以用于名称解析。事实上,执行:
\ndef f():\n return x\n\ndef g():\n x = 0\n return f()\n\nprint(g())\n
Run Code Online (Sandbox Code Playgroud)\n提高:
\nNameError: name \'x\' is not defined\n
Run Code Online (Sandbox Code Playgroud)\n它们具有相当松散的后期绑定属性,其中只有在引入自由变量的代码块的外部代码块中发生的名称绑定才能用于名称解析。确实执行
\nNameError: name \'x\' is not defined\n
Run Code Online (Sandbox Code Playgroud)\n印刷:
\n0\n
Run Code Online (Sandbox Code Playgroud)\n与严格的后期绑定属性相比,松散的后期绑定属性有哪些优点和缺点?
\nSymbol
从编程语言设计的角度来看,Ruby 和 JavaScript(也许其他一些也具有等效类型的编程语言)是否具有相同的目的?(问题#1)
我知道这两种语言都有Symbol
类型。
Symbol
在这两种语言中都可以用来从对象中检索方法:
const a = [];
a[Symbol.iterator] // [Function: values]
Run Code Online (Sandbox Code Playgroud)
a = []
a.method(:at) => #<Method: Array#at(_)>
Run Code Online (Sandbox Code Playgroud)
Ruby 中的符号是独一无二的:
:a.object_id => 776028
:a.object_id => 776028
Run Code Online (Sandbox Code Playgroud)
在 JavaScript 中,使用创建的符号Symbol.for
保存在内部字典中,这使得它类似于unique
:
Symbol.for('a') === Symbol.for('a') // true
Run Code Online (Sandbox Code Playgroud)
但Symbol(..)
无论参数是什么,总是返回一个新符号:
// Why this is designed this way? Question #2
Symbol('a') === Symbol('a') // false
Run Code Online (Sandbox Code Playgroud) [编辑:这个问题不是这个问题的重复;我问的是语言设计的问题,即为什么它首先是这样的。我对它的行为方式并不感到困惑,我对为什么首先决定这种行为感到困惑。]
在Python(以及其他一些语言,例如Lua)中,布尔运算符and
和or
并不像人们所期望的那样返回布尔值True
,False
而是:
x or y
:如果x
为假,则y
,否则x
x and y
如果x
为 false,则x
,否则y
很容易看出,在x
和y
是布尔值的特殊情况下,其行为符合预期。
我的问题是,以这种方式进行概括的实际理由是什么?我知道你可以用它来实现以下技巧:
foo = x or None
Run Code Online (Sandbox Code Playgroud)
或者 DIY 三元运算符,例如:
foo = x and y or z
Run Code Online (Sandbox Code Playgroud)
但我觉得这些都不足以为这种令人惊讶的行为提供充分的理由。每当我看到非布尔返回值被依赖于其实际值(而不是在 if 语句或其他东西中,无论哪种方式都无关紧要),我总是必须仔细检查我对它的理解,因为我总是忘记它是如何工作的,我需要再次查找它。我通常更喜欢以更详细的方式编写。是否有一个根本原因为什么它应该以这种方式工作,或者它真的只是为了技巧?
如果您被迫简化可用于循环的C#关键字,请只选择一个要保留的关键字.
您的决定是否有任何绩效考虑?
其实我不知道他们的内在机制,所以在这里我想要采访你们中的人知道细节.但是,某人已经关闭了它.好难过!
c# compiler-construction programming-languages language-design lexical-analysis
使用以下代码:
case "GETSITES":
case "SITESETUP":
MessageBox.Show("Help! I am suffering from the Air-Conditioned Nightmare!!!");
// ...
Run Code Online (Sandbox Code Playgroud)
将MessageBox.Show
被执行或者开关值为"GETSITES"
还是"SITESETUP"
?
或者仅当开关值是"SITESETUP"
?
既然"GETSITES"
没有休息,我想是的,但我不确定.
UPDATE
我想我应该把我的问题写成:
这两个代码片段在语义上是等价的吗?
片段1
case 0:
case 1:
// bla bla bla;
break;
Run Code Online (Sandbox Code Playgroud)片段2(伪代码)
case 0, 1:
// bla bla bla;
break;
Run Code Online (Sandbox Code Playgroud)什么是用于选择运营商的理由!
/ &&
/ ||
在not
/ and
/ or
?背后有一些历史,还是只是偏好?
我有一些想法:
Rust遵循C/C++.但是,在for-each循环的情况下,使用的是更像英语的版本for x in X
而不是C++ for (x: X)
,所以Rust不仅盲目地遵循C/C++的所有内容.
符号更短.两者之间的字符数似乎相似.
由于与类型规范的冲突,语法必须不同.也有区别a as u8
而不是(u8)a
.
由于Rust是一种新语言,我认为他们可以选择符号或单词而不会出问题.Rust选择符号而非文字的原因是什么?为什么不同时选择?
析构函数的语法是~classname
. 这导致需要在析构函数调用中显式写入对象的类型。为了避免这种情况,C++17 引入了std::destroy_at
.
那么,Bjarne Stroustrup 选择~classname
析构函数语法的最初理由是什么?如果语法不依赖于类型,std::destroy_at
则不需要。
我正在尝试使用 LLVM C API 为动态语言构建 JIT 编译器,但我坚持实现动态类型,例如在函数定义中,LLVM 需要每个参数的类型,但类型在运行时之前是未知的,基于什么用户通行证,我用谷歌搜索了一段时间,但没有任何关于它的好资源,我也尝试查看 Julia 的源代码,看看他们是如何做到的,不幸的是代码又大又复杂,我不得不到处寻找这样的一个小细节,从我目前看到的情况来看,它们将它们的类型表示为一个空的 LLVM 结构指针和一个保存一些额外数据的 func sig 类型,但我非常不确定它是如何工作的,或者即使我是解释正确,任何资源都可能有帮助,最感谢示例代码,示例不必使用 C API,C++ 也很好,我会以一种或另一种方式自己转换它。
提前致谢。
为什么^
不在Python中进行平方?我知道取幂是**
相反的,但究竟是什么^
以及为什么不使用该算子呢?
例如2^2=0
,3^2=1
.
language-design ×12
python ×3
c ×2
c# ×2
c++ ×2
boolean ×1
destructor ×1
java ×1
javascript ×1
late-binding ×1
llvm ×1
ruby ×1
rust ×1
typescript ×1