有人能解释一下C语言是强型还是弱型?解释原因。
如果我有一个名为concat的函数,它可以接受任何对象,那么这就是弱类型吗?
1 2 3 4
| function concat(Object stuff)
{
//do something here to stuff
} |
- 下议院的人想给出一个理由,这样@mrshll187就可以知道将来要避免做什么了吗?
- @Abemiessler你的意思是像SERJ在你发表评论前两分钟发表的评论,那有几张赞成票?
- 你为什么要相信其中一个?你的问题没有背景
- @塞维,不,我想我在找更多的。您可能会注意到,Shll187先生也发表了评论,说他在谷歌上搜索过,结果不太好。谷歌,然后来这里,如果你没有运气似乎是一个相当合理的方法。顺便说一句,我认为像你这样卑鄙的评论会使我们所有人花时间去帮助别人变得不那么愉快。我肯定你不在乎,但那是我的两分钱。干杯。
- @SHLL187先生:本来可以在你最初的问题中这样说,而不是让我们问。
- @Abemiessler很好,谷歌搜索这个问题的确切标题会产生几个结果,这些结果在我的脑海中非常清楚地回答了这个问题。如果OP无法理解他看到的结果,那么他应该更详细地解释他发现了什么、为什么困惑等等。事实上,这个问题清楚地表明没有研究工作。如果你觉得给出的评论不够详细,那么也许你可以自己提供这些细节,或者要求其他人更详细,而不是假装没有人在评论时提供任何评论。
- 嗯…这不是我上次的评论所指的。
- @严格地说,除非您定义了这些术语的含义,否则您不能说明它是强类型还是弱类型。对定义没有普遍的约定,所以除非你也提供了一个定义,否则它不能被回答。由于这个问题没有足够的信息来回答,这确实是一个糟糕的问题。也就是说,只要你以后花更多的时间和精力去问问题,你就不应该放弃这种不应该问问题的想法。一个更好的方法是问好的问题很难,一定要努力。
- "我认为除了[…]之外,我没有真正从这一切中获得任何东西来避免在堆栈溢出时问任何问题。"考虑到您已经在这里问了200多个问题,我觉得很难认真对待这种声明和态度。不管怎样,既然你似乎不明白,我会给你拼出来:你需要编辑你的问题,包括你所做的研究,以及你发现的任何矛盾的答案。这很简单,但是相反,你表现得好像你在心理上受到了侵犯,或是什么,忽略了我们关于你的问题需要改进的其他线索。
来自http://ericlippert.com/2012/10/15/is-c-a-strengly-typed-or-a-weak-typed-language/
Is C# a strongly typed or a weakly typed language?
Yes.
That is unhelpful.
I don't doubt it. Interestingly, if you rephrased the question as an
"and" question, the answer would be the same.
What? You mean, is C# a strongly typed and a weakly typed language?
Yes, C# is a strongly typed language and a weakly typed language.
I'm confused.
Me too. Perhaps you should tell me precisely what you mean by
"strongly typed" and"weakly typed".
Um. I don't actually know what I mean by those terms, so perhaps that is the question I should be asking. What does it really mean for
a language to be"weakly typed" or"strongly typed"?
"Weakly typed" means"this language uses a type verification system
that I find distasteful", and"strongly typed" means"this language
uses a type system that I find attractive".
- @SHLL187先生,这是我唯一的回答栏,没有说明什么可以证明是错误的。考虑到所问的问题,这里的每件事都是完全正确的。当你搜索答案时,这个链接也应该出现在谷歌中。
- 维基百科几乎证实了"强类型"和"弱类型"通常并不意味着什么,一个用来赞扬语言,另一个用来批评语言。那篇文章比大多数TBH更具说服力。
C是强类型。
ECMA-334将C定义为"C"(发音为"C sharp"),它是一种简单、现代、面向对象和类型安全的编程语言。
维基百科定义了类型安全
Type safety is synonymous with one of the many definitions of strong
typing; but type safety and dynamic typing are mutually compatible.
维基百科将强类型定义为
In computer science and computer programming, a type system is said to
feature strong typing when it specifies one or more restrictions on
how operations involving values of different data types can be
intermixed. The opposite of strong typing is weak typing.
也许最好问一下C是否是一种类型安全的语言,因为没有人能就"强"和"弱"类型是否真正意味着编译器将进行类型检查达成一致。
C确实有一些类似于动态语言的构造可用,但值得注意的是,这些构造在编译时仍然是类型安全的。
Beginning in Visual C# 3.0, variables that are declared at method
scope can have an implicit type var. An implicitly typed local
variable is strongly typed just as if you had declared the type
yourself, but the compiler determines the type.
http://msdn.microsoft.com/en-us/library/bb383973.aspx
dynamic关键字的工作原理基本相同,只是它是在运行时而不是编译时进行评估,就像var的情况一样。
Visual C# 2010 introduces a new type, dynamic. The type is a static
type, but an object of type dynamic bypasses static type checking. In
most cases, it functions like it has type object. At compile time, an
element that is typed as dynamic is assumed to support any operation.
http://msdn.microsoft.com/en-us/library/dd264736.aspx
- 为什么投反对票呢?完全正确。如果你选择投反对票,请发表评论。这样我就能理解为什么你不喜欢这个答案。
- There isn't any if's/and's/but's to this argument."嗯,"强类型"没有明确的含义,不能说明它是否适用于给定的语言。
- 我给了你一个赞成票,但我想DW来自于你对这个论点的断言,"没有什么是/是/和/但是。"我可以给你一些线索,告诉你为什么这不是一件好事:如果你提出了一个论点,而不是"没有正面有效的相反论点",那么你根本就没有给出一个论点,相反,你是同意的。叮当作响。第二:当然有"如果"和"但是":看看吉迪恩的回答,很快就会被接受,如果这样的话,它的质量几乎保持不变。
- 感谢您的精彩反馈。我已经根据反馈调整了我的答案。也许我能把这些积分拿回来。
- 你所引用的强类型的定义并没有特别的意义,我认为现有的任何语言都不符合它的标准。这也不是一个普遍认同的定义。请注意,dynamic专门告诉编译器停止执行类型检查,因此编译器执行类型检查这一稍后定义的存在违反了该定义。
- dynamic没有告诉编译器停止进行类型检查。dynamic是expandoobject类型,它或多或少是一个键值字典。public sealed class ExpandoObject : IDynamicMetaObjectProvider, IDictionary, ICollection>, IEnumerable>, IEnumerable, INotifyPropertyChanged
- @Young dynamic先生正告诉编译器停止进行类型检查,基本上就是这样。任何动态调用都需要在运行时创建C编译器的特殊实例,以确定动态对象成员的适当解析应该是什么。并非所有的dynamic对象都是ExpandoObjects对象。ExpandoObjects几乎总是用于dynamic变量中,因为它们是为这个变量而构建的,但并非所有dynamic对象都是expando对象;事实上,很少有这样的对象。
- 我做了一些调查,发现我们是对的和错的。这就是为什么有这么多混乱。来自msdn杂志:The dynamic keyword acts as a static type declaration in the C# type system. This way C# got the dynamic features and at the same time remained a statically typed language. Why and how this decision was made is explained in the presentation"Dynamic Binding in C# 4" by Mads Torgersen at PDC09 (microsoftpdc.com/2009/FT31). When you use the dynamic keyword you tell the compiler to turn off compile-time checking.msdn.microsoft.com/en-us/magazine/gg598922.aspx
- @杨先生,那你从那句话里说什么?使用dynamic时,删除所有有意义的静态类型,无论何时使用,都会有效地将其关闭。因此,虽然C可以在维护静态类型的同时使用,但是有许多方法会违反静态类型。动态类型是一种,unsafe代码是另一种,甚至基本类型转换也是违反静态类型的最简单和最容易的方法,因此C不是一种完全静态类型化的语言。
- 让我们在聊天中继续讨论
一般情况下:c_以强类型方式使用,意思是:变量声明为特定的Type(字符串、int、用户定义的类型等),以后不能分配不同类型的值。
例如:在C中不能有以下内容:
如下面的注释所示,C可以不同地使用。
使用"强"类型可以让编辑器/编译器提醒您出错,并让编辑器向您提供缩小到您可能需要的范围的建议。
- 根据这个定义,不可能有一种不是强类型的语言,因为几乎所有变量都是某种类型,例如表示"任何东西"的变量。
- @也许我不清楚。我的意思是变量将被永久地设置为某种类型。与之相反,比如,javascript,其中变量可以是字符串,然后是int等。
- 你的意思是像在C中一样,我可以把一个字符串赋给object类型的变量,然后再赋给它一个int?
- 好了。好啊。我放弃了。:)
- 聪明的举动…
- 根据您的编辑,您只能证明C_可用于强类型庄园;但请注意,您不会被迫这样做。它允许使用您定义为"强类型"的内容,但可以在语言中完全违反。
- @谢谢你的评论。我很高兴我冒昧地回答了这个问题,因为我对这件事了解得很清楚。我心里有一种"知识",即C是强类型的,没有注意到显然这不是"强制性的"。
- 实际上,即使使用object,c也有部分强类型——不能简单地引用变量的属性。例如,你不能设置object i ="ten";然后得到i.Length。
- @如果您使用dynamic,您可以使用ispiro。同样,您可以使用casting命令编译器从i中的对象获取Length属性。事实上,从本质上讲,铸造违反了强类型。它的全部目的是允许您违反编译器的类型系统。
强类型和弱类型的定义有很多种,很多种,到了需要在使用这个术语时定义它的含义的程度。我发现一个有用的定义是"语言是否强迫我为参数之类的东西指定类型?"这将诸如C这样的语言分隔到一边,将JavaScript分隔到另一边,我发现这一区别很有用。
要求某人命名一个类型,而不是依赖"duck-typing"这样的东西,这在静态分析中有好处,但在指定共享公共功能的类型时有缺点。因此,这些语言中的许多都进化出复杂的类型关系规范系统,通常是基于第一类的编程,随后是复杂的模板系统或推理系统,这样程序员就可以说"类型A是类型B的子集"或"类型C是一个元类型,可以应用于满足条件的任何其他类型。ONS D和E"等等。
- 然而,在许多地方,c允许你所说的"duck-typing"是非强类型语言的一个特点。最常见的例子是foreach循环,它适用于具有GetEnumerator方法的任何对象。
- @服务生那不是鸭子打字。它不检查名称"getEnumerator",而是检查类型是否声明为实现System.Collections.IEnumerable或System.Collections.Generic.IEnumerable。
- @实际上,它有点像plynx;它基于名称/签名,而不是特定的接口。其他例子包括Linq和await。
- @plynx(与你的评论编辑)不,你是不正确的。foreach不需要这些接口。这些接口保证了这些签名,但即使没有它们,功能也可以正常工作。
- @Marcgravell很高兴知道…我只是根据现有的文件和以前的知识。从4.0开始,我就没有在C中做过太多的编码。
- @Plynx认为(foreach是C 1.2以来的情况,甚至可能在那之前(我没有1.0规格可供参考)。Linq的成绩是3.5分。
- @我学到了一些新东西。似乎foreach文档中的初始描述是错误的msdn.microsoft.com/en-us/library/ttw7t8t6(v=vs.110).aspx,详细信息在msdn.microsoft.com/en-us/library/9yb8xew9.aspx中。谢谢!
- 请注意,这只是一个简单的例子,也是一个更常见的例子。还有很多其他的。Marc提到了一些,当然还有dynamic,除此之外,unsafe代码中可以做的所有事情都可以完全消除关于托管代码中程序状态的任何假设。
- @Servy我认为这说明强/弱类型最多是一种粗糙的语言分类工具。一般来说,我们的程序员喜欢访问这两组特性(如果可能的话),以便有机会创建更优雅的编码结构。我对区分的主要用途是历史性的——我发现需要类型规范的语言倾向于沿着类似的路径增长,而不需要类似的语言,尽管最终它们以另一种方法的可选特性结束。
这是一篇关于这个主题的博客文章,作者是C编译器的主要开发人员之一。
简而言之,这个问题本身是有缺陷的,不能以目前的形式得到合理的回答。
- 这就是为什么存在近距离投票:p
- @Boltclock好吧,答案是没有答案,而不是"我们谁都不知道答案是什么"。事实上,有一个相当好的解释可以解释为什么没有答案,这就是为什么我没有投票结束。
根据msdn,c是一种强类型语言。
- msdn也是错误的,因为编写一个非强类型的C程序很简单。C可以编写强类型的程序,但没有什么能强迫您这样做。