我试图围绕C与Objective-C中的使用和语法的一些差异.特别是,我想知道C运算符和Objective-C中的点运算符和箭头运算符的使用方式有何不同(以及原因).这是一个简单的例子.
C代码:
// declare a pointer to a Fraction
struct Fraction *frac;
...
// reference an 'instance' variable
int n = (*frac).numerator; // these two expressions
int n = frac->numerator; // are equivalent
Run Code Online (Sandbox Code Playgroud)
Objective-C代码:
// declare a pointer to a Fraction
Fraction *frac = [[Fraction alloc] init];
...
// reference an instance variable
int n = frac.numerator; // why isn't this (*frac).numerator or frac->numerator??
Run Code Online (Sandbox Code Playgroud)
那么,看看frac两个程序中的相同情况(即它是指向Fraction对象或结构的指针),为什么它们在访问属性时使用不同的语法?特别是,在C中,numerator可以访问属性frac->numerator,但是使用Objective-C,可以使用点运算符访问它frac.numerator.既然frac是两个程序中的指针,为什么这些表达式不同?任何人都可以帮我澄清一下吗?
给出以下场景,将其解释为C++ 0x代码:
struct B { };
struct A { B b; };
int main() {
B const& b = A().b;
/* is the object still alive here? */
}
Run Code Online (Sandbox Code Playgroud)
Clang和GCC(截至2011/02的行李箱版本)表现不同:Clang延长了使用寿命.GCC移动B到新的临时对象,然后将引用绑定到该新临时对象.
我找不到任何一种行为都可以从标准的词汇中得出.表达式A().b不是暂时的(见5.2.5).有人可以向我解释以下内容吗?
谢谢!
迭代指针的向量(或其他容器)时,使用以下优势和/或优势是否有任何区别:
for (it = v.begin(); it != v.end(); ++it) {
(*it)->method();
}
Run Code Online (Sandbox Code Playgroud)
要么
for (it = v.begin(); it != v.end(); ++it) {
(**it).method();
}
Run Code Online (Sandbox Code Playgroud) 我想在haskell中编写一个无点函数,为了简单起见,我想说要创建这个函数:
maxmin :: Ord a => a -> a -> a -> a
maxmin a b c = max a (min b c)
Run Code Online (Sandbox Code Playgroud)
我可以改进这个
maxmin a b = (max a) . (min b)
Run Code Online (Sandbox Code Playgroud)
但有没有办法摆脱a和b?
我有两个功能:
f :: a -> Maybe a
g :: a -> a
Run Code Online (Sandbox Code Playgroud)
我想创建这样的功能:
h :: a -> Maybe a
h x
| isJust(f x) = Just (g $ fromJust(f x))
| otherwise = Nothing
Run Code Online (Sandbox Code Playgroud)
我怎样才能以更优雅的方式做到这一点?
C++
给定基类Base和派生类Derived,构造函数构造的第一件事Derived是Base子对象.由于它被称为子对象,我认为可以通过在对象上使用点运算符从客户端代码访问它,就像任何其他成员对象一样Derived.我还假设它可以通过Derived实现代码访问this->Base.完全由已经初始化后跟分号的对象的名称组成的语句应该编译但是也没有效果.继这一逻辑,给定一个Derived目标myderived,我想:myderived.Base;在客户端代码和this->Base;中Derived的实现也不言编译.
为什么?我知道Base,它本身就是Base类的名称,而不是Base对象的名称.但我认为Base由myderived.(客户端代码)或this->(实现代码)前缀限定引用基础子对象,因为Base没有任何前缀限定,是在构造函数初始化程序中Base引用子对象的方式Derived.请参阅下面的代码,其中(注释掉的代码旁边)适用于VC12和g ++ 4.8.Derivedextends Base和Derived的定义声明了一个Base数据成员membase,所以我的Derived对象应该包含两个Base对象.假设成功编译不是任何编译器 - 标准 - 不符合的结果,控制台输出(在注释中)显示两个不同对象的int成员的不同值,意味着在's ctor初始化器中,指的是继承的子对象,而引用声明的数据成员对象.在's ctor初始化器中,具体指的是继承的子对象,而不仅仅是任何对象或类.nBaseDerivedBaseBasemembaseDerivedBaseBaseBase
#include …Run Code Online (Sandbox Code Playgroud) 我想在Haskell中写这样的东西:
length . nub . intersect
Run Code Online (Sandbox Code Playgroud)
但它不起作用.
*Main Data.List> :t intersect
intersect :: Eq a => [a] -> [a] -> [a]
*Main Data.List> :t nub
nub :: Eq a => [a] -> [a]
*Main Data.List> :t length
length :: [a] -> Int
Run Code Online (Sandbox Code Playgroud)
根据上式,我的理解是,intersect返回类型[a],并捐赠给nub,这恰恰是一个类型的[a],然后也返回一个类型[a]来length,最后返回应该是一个Int.它出什么问题了?
haskell combinators pointfree function-composition dot-operator
我同意这可能是一个非常初学者的问题,但我不知道为什么我不能使用“。” 访问对象指针的成员。
\n例如
\nJMP *sum_obj = new JMP("0");\nJMP a;\nsum_obj->number;\na.number;\n\nsum_obj.number; // error: request for member \xe2\x80\x98number\xe2\x80\x99 in \xe2\x80\x98sum_obj\xe2\x80\x99, which is of pointer type \xe2\x80\x98JMP*\xe2\x80\x99 (maybe you meant to use \xe2\x80\x98->\xe2\x80\x99 ?)\nRun Code Online (Sandbox Code Playgroud)\n这里,为什么要使用->会员sum_obj number呢?
在下面的Haskell代码中,函数typeError没有进行类型检查.
wrap x = [x]
listf :: [[a]] -> [[a]]
listf = id
typeCheck :: [a] -> [[a]]
typeCheck x = listf (wrap x)
typeError :: [a] -> [[a]]
typeError = wrap . listf
Run Code Online (Sandbox Code Playgroud)
如果GHC取消注释,GHC会产生此错误:
Couldn't match type `a' with `[a0]'
`a' is a rigid type variable bound by
the type signature for typeError :: [a] -> [[a]] at tim.hs:10:1
Expected type: [a] -> [a]
Actual type: [[a0]] -> [[a0]]
In the second argument of `(.)', namely `listf'
In the …Run Code Online (Sandbox Code Playgroud) 我有一个使用Dot-operator的函数.现在我想写没有点.我怎样才能做到这一点?
all p = and . map p
Run Code Online (Sandbox Code Playgroud)
这是正确的吗?
all p = and (map p)
Run Code Online (Sandbox Code Playgroud)
我收到这些错误:
4.hs:8:13:
Couldn't match expected type `[Bool]'
with actual type `[a0] -> [b0]'
In the return type of a call of `map'
Probable cause: `map' is applied to too few arguments
In the first argument of `and', namely `(map p)'
In the expression: and (map p)
Run Code Online (Sandbox Code Playgroud) dot-operator ×10
haskell ×5
c++ ×4
pointers ×2
pointfree ×2
c ×1
c++11 ×1
combinators ×1
function ×1
inheritance ×1
iterator ×1
namespaces ×1
objective-c ×1
operators ×1
temporary ×1
vector ×1