我已经写了一点C,我可以很好地阅读它以大致了解它在做什么,但每次我遇到一个宏它都完全抛弃了我.我最终必须记住宏是什么,并在我阅读时将其替换为我的脑袋.我遇到的那些直观且易于理解的东西总是像迷你小功能一样,所以我总是想知道为什么它们不仅仅是功能.
我可以理解在预处理器中为调试或跨平台构建定义不同构建类型的需要,但是定义任意替换的能力似乎只对使得已经很难理解的语言更加难以理解.
为什么为C引入了如此复杂的预处理器?并且有没有人有一个使用它的例子,这将使我理解为什么它似乎仍然用于除了简单的#debug风格条件编译之外的目的?
编辑:
读了很多答案之后我还是不明白.最常见的答案是内联代码.如果内联关键字没有这样做,那么它有充分的理由不这样做,或者实现需要修复.我不明白为什么需要一个完全不同的机制,这意味着"真正内联这个代码"(除了形成内联之前编写的代码).我也不明白提到"如果它太愚蠢而不能被赋予功能"的想法.当然,任何需要输入并产生输出的代码都最好放在一个函数中.我想我可能没有得到它,因为我不习惯编写C的微观优化,但预处理器只是对一些简单问题的复杂解决方案.
.Net 3.5不支持元组.太糟糕了,但不确定.net的未来版本是否会支持元组?
我最近了解到,Java源代码中的Unicode不仅可以作为Unicode字符(例如double ? = Math.PI;),还可以作为转义序列(例如double \u03C0 = Math.PI;).
第一个变体对我有意义 - 它允许程序员用他们选择的国际语言命名变量和方法.但是,我没有看到第二种方法的任何实际应用.
以下是一些用于说明用法的代码,使用Java SE 6和NetBeans 6.9.1进行了测试:
此代码将打印出3.141592653589793
public static void main(String[] args) {
double ? = Math.PI;
System.out.println(\u03C0);
}
Run Code Online (Sandbox Code Playgroud)
说明:π和\ u03C0是相同的Unicode字符
此代码不会打印任何内容
public static void main(String[] args) {
double ? = Math.PI; /\u002A
System.out.println(?);
/* a comment */
}
Run Code Online (Sandbox Code Playgroud)
说明:上面的代码实际编码:
public static void main(String[] args) {
double ? = Math.PI; /*
System.out.println(?);
/* a comment */
}
Run Code Online (Sandbox Code Playgroud)
哪个评论打印出来的声明.
仅从我的示例中,我注意到此语言功能存在许多潜在问题.
首先,一个糟糕的程序员可以使用它来秘密注释掉一些代码,或创建多种识别相同变量的方法.也许还有其他可怕的事情可以做,我没有想过.
其次,IDE之间似乎缺乏支持.NetBeans和Eclipse都没有为示例提供正确的代码突出显示.实际上,NetBeans甚至标记了语法错误(尽管编译不是问题).
最后,此功能的记录很少,并且不被普遍接受.为什么程序员会在他的代码中使用其他程序员无法识别和理解的东西?事实上,我甚至在Hidden Java Features问题上找不到这个. …
我想正确理解Perl中的哈希值.我不得不间歇性地使用Perl很长一段时间,而且大多数时候我都需要这样做,它主要与文本处理有关.
每次,我都要处理哈希,它会搞砸.我觉得哈希的语法非常神秘
哈希和哈希引用的好解释,它们的差异,当它们被要求等时将非常感激.
我听过/读过这个词,但不太明白这意味着什么.
我什么时候应该使用这种技术,我将如何使用它?谁能提供一个好的代码示例?
在C#语言规范描述键入第7.5.2节推断.其中有一个我不明白的细节.考虑以下情况:
// declaration
void Method<T>(T obj, Func<string, T> func);
// call
Method("obj", s => (object) s);
Run Code Online (Sandbox Code Playgroud)
Microsoft和Mono C#编译器都正确推断T= object,但我对规范中算法的理解会产生T= string然后失败.以下是我的理解:
第一阶段
如果Ei是匿名函数,则从Ei到Ti 进行显式参数类型推断(第7.5.2.7节)
⇒没有效果,因为lambda表达式没有明确的参数类型.对?
否则,如果Ei具有类型U并且xi是值参数,则从U到Ti进行下限推断.
⇒第一个参数是静态类型string,所以这会增加string下限T,对吧?
第二阶段
所有不固定的类型变量Xi不依赖于(§7.5.2.5)任何Xj是固定的(§7.5.2.10).
⇒ T是不固定的; T不依赖于任何东西......所以T应该修复,对吗?
§7.5.2.11修复
候选类型Uj的集合开始于Xi的边界集合中的所有类型的集合.
⇒{ string(下界)}
然后我们依次检查Xi的每个边界:[...]对于Xi的每个下界U,从候选集中移除没有从U隐式转换的所有类型Uj.[...]
⇒不会从候选集中删除任何内容,对吗?
如果在剩余的候选类型Uj中存在唯一的类型V,其中存在对所有其他候选类型的隐式转换,则Xi被固定为V.
⇒因为只有一种候选类型,所以这是真实的,所以Xi固定为string.对?
那我哪里错了?
我正在寻找功能编程概念.
我已经使用Javascript多年来在Web应用程序中进行客户端脚本编写,除了使用原型之外,还有简单的DOM操作,输入验证等.
最近,我经常读到 Javascript是支持函数式编程的语言之一.
凭借我对Javascript的熟悉和经验,我倾向于使用它来学习函数式编程.我希望我能够更专注于主要的功能概念,而不是被一种全新的语法所困扰或分散注意力.
总而言之,Javascript是学习函数式编程概念的不错选择吗?Javascript中哪些功能相关/支持函数式编程?
(我想这个问题可能适用于许多类型语言,但我选择使用C++作为例子.)
为什么没有办法写:
struct foo {
little int x; // little-endian
big long int y; // big-endian
short z; // native endianness
};
Run Code Online (Sandbox Code Playgroud)
指定特定成员,变量和参数的字节顺序?
我知道变量的类型不仅决定了用于存储值的字节数,还决定了在执行计算时如何解释这些字节.
例如,这两个声明每个都分配一个字节,对于两个字节,每个可能的8位序列都是有效值:
signed char s;
unsigned char u;
Run Code Online (Sandbox Code Playgroud)
但是相同的二进制序列可能会有不同的解释,例如11111111,在分配时指的是-1,而指定时指的是s255 u.当有符号和无符号变量涉及相同的计算时,编译器(主要)负责正确的转换.
在我的理解中,字节序只是同一原则的变体:基于关于存储它的存储器的编译时信息对二进制模式的不同解释.
在允许低级编程的类型语言中使用该功能似乎是显而易见的.但是,这不是C,C++或我所知的任何其他语言的一部分,我没有在网上找到任何关于此的讨论.
我会试着总结一下我在询问后的第一个小时内收到的许多评论中的一些内容:
此外,现在我意识到签名和字节序不是一个完美的类比,因为:
big int并little int会具有完全相同的数值范围.unsigned char(假设char有8位)130不能用a表示signed …请考虑以下示例:
class A:
@property
def x(self): return 5
Run Code Online (Sandbox Code Playgroud)
所以,当然要求a = A(); a.x回归5
但想象一下,您希望能够修改属性x.
这样,例如:
class A:
@property
def x(self, neg = False): return 5 if not neg else -5
Run Code Online (Sandbox Code Playgroud)
并称之为 a = A(); a.x(neg=True)
这将引发一个TypeError:,'int' object is not callable这很正常,因为我们x被评估为5.
所以,我想知道如果可能的话,如何将多于一个参数传递给属性getter.
我想测试一个对象是否是一个类的实例,并且只测试这个类(没有子类).我可以这样做:
obj.__class__ == Foo
obj.__class__ is Foo
type(obj) == Foo
type(obj) is Foo
Run Code Online (Sandbox Code Playgroud)
是否有理由选择一个而不是另一个?(业绩差异,陷阱等)
换句话说:a)使用__class__和type(x)?之间有什么实际区别吗?b)类对象总是可以安全地进行比较is吗?
更新:感谢大家的反馈.我仍然对类对象是否是单身人士感到困惑,我的常识说他们是,但是很难得到确认(尝试谷歌搜索"python","class"和"unique"或"singleton") .
我还要澄清一点,根据我的特殊需求,"更便宜"的解决方案才是最好的,因为我正在尝试优化一些专业课程中的大部分(几乎达到了理智的程度)要做的是删除Python并在C)中开发该特定模块.但问题背后的原因是为了更好地理解语言,因为它的某些功能对于我来说很容易找到这些信息.这就是为什么我让讨论延伸一点而不是解决__class__ is,所以我可以听到更有经验的人的意见.到目前为止,它已经非常富有成效!
我进行了一项小测试,以测试4种替代方案的性能.分析器结果是:
Python PyPy (4x)
type() is 2.138 2.594
__class__ is 2.185 2.437
type() == 2.213 2.625
__class__ == 2.271 2.453
Run Code Online (Sandbox Code Playgroud)
不出所料,is表现优于==所有情况.type()在Python中表现更好(2%更快)并且__class__在PyPy中表现更好(快6%).有趣的是,__class__ ==在PyPy 中表现更好type() is.
更新2:很多人似乎并不理解我所说的"一个类是一个单身人士",所以我将用一个例子说明:
>>> class Foo(object): pass
...
>>> X = Foo
>>> class Foo(object): pass
... …Run Code Online (Sandbox Code Playgroud) c# ×3
python ×2
.net ×1
c ×1
c++ ×1
endianness ×1
hash ×1
java ×1
javascript ×1
macros ×1
perl ×1
properties ×1
tuples ×1
unicode ×1