我一直在尝试在业余时间学习C语言,其他语言(C#,Java等)具有相同的概念(通常是相同的运算符)......
我想知道是,在核心层,是什么位移(<<
,>>
,>>>
)这样做,可以帮助它什么问题解决,和周围的弯曲什么潜伏的陷阱?换句话说,一个绝对的初学者指导比特移位的所有优点.
NSInvocation
工作究竟如何?有一个很好的介绍吗?
我特别关注以下代码(来自Cocoa Programming for Mac OS X,3rd Edition)的工作原理,但是也可以独立于教程示例应用这些概念.代码:
- (void)insertObject:(Person *)p inEmployeesAtIndex:(int)index
{
NSLog(@"adding %@ to %@", p, employees);
// Add inverse of this operation to undo stack
NSUndoManager *undo = [self undoManager];
[[undo prepareWithInvocationTarget:self] removeObjectFromEmployeesAtIndex:index];
if (![undo isUndoing])
[undo setActionName:@"Insert Person"];
// Finally, add person to the array
[employees insertObject:p atIndex:index];
}
- (void)removeObjectFromEmployeesAtIndex:(int)index
{
Person *p = [employees objectAtIndex:index];
NSLog(@"removing %@ from %@", p, employees);
// Add inverse of this operation to undo stack
NSUndoManager …
Run Code Online (Sandbox Code Playgroud) 正如我之前的许多问题所述,我正在通过K&R工作,目前正在进入预处理器.其中一个更有意思的事情 - 我之前从未尝试过的任何学习C的尝试 - 是##
预处理器操作员.根据K&R的说法:
预处理器运算符
##
提供了一种在宏扩展期间连接实际参数的方法.如果替换文本中##
的参数与a相邻,则参数将替换为实际参数,##
并删除周围的空白区域,并重新扫描结果.例如,宏paste
连接其两个参数:
#define paste(front, back) front ## back
所以
paste(name, 1)
创建令牌name1
.
如何以及为什么有人会在现实世界中使用它?它的使用的实际例子是什么,有什么需要考虑的?
你知道,那个输出这个=>
------清理开始:项目:Foo.Bar,配置:调试任何CPU ------
==========清理:1成功,0失败,0跳过==== ======
什么是清洁?
在C#中,我有一个int数组,只包含数字.我想将此数组转换为字符串.
数组示例:
int[] arr = {0,1,2,3,0,1};
Run Code Online (Sandbox Code Playgroud)
如何将其转换为格式为的字符串:"012301"
?
我NSMutableArray *categories
在我的视图控制器.h文件中声明了一个,并为它声明了一个属性.
在我的.m文件中委托的parser:foundCharacters:
方法中NSXMLParser
,我有这个代码:
-(void)parser:(NSXMLParser *) parser foundCharacters:(NSString *)string
{
if (elementFound)
{
element = string;
[self.categories addObject:element];
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我[self.categories addObject:element]
在调试模式中踩到它后将鼠标悬停在线上时,XCode告诉我大小为0x0,0个对象.我的XML文件中有3个元素,因此数组中应包含3个项目.
我错过了一些非常明显的东西,我无法弄清楚是什么.
当我读到有关C#或Java等JITted语言的性能时,作者通常会说它们理论上应该/可以胜过许多本机编译的应用程序.理论上,本机应用程序通常只是为处理器系列(如x86)编译,因此编译器无法进行某些优化,因为它们可能并非真正在所有处理器上进行优化.另一方面,CLR可以在JIT过程中进行特定于处理器的优化.
有谁知道微软(或Mono)的CLR在JIT过程中是否实际执行特定于处理器的优化?如果是这样,有什么样的优化?
我通过Gmail将代码发送给了我的朋友,但正如您猜测的那样,代码未在Gmail中突出显示.是否有解决方案来突出显示通过Gmail发送的代码?
我继续读到,在C中,使用指针算法通常比下标数组访问更快.即使使用现代(据称是优化的)编译器,这是真的吗?
如果是这样,当我开始在Mac上学习C到Objective-C和Cocoa时,情况仍然如此吗?
在C和Objective-C中,哪种是数组访问的首选编码风格?被认为(由各自语言的专业人士)更清晰,更"正确"(缺乏更好的术语)?
在第2章,关于按位运算符的部分(第2.9节),我无法理解其中一个示例方法是如何工作的.
这是提供的方法:
unsigned int getbits(unsigned int x, int p, int n) {
return (x >> (p + 1 - n)) & ~(~0 << n);
}
Run Code Online (Sandbox Code Playgroud)
这个想法是,对于给定的数字x,它将返回从位置p开始的n位,从右边开始计数(最右边的位是位置0).给出以下方法:main()
int main(void) {
int x = 0xF994, p = 4, n = 3;
int z = getbits(x, p, n);
printf("getbits(%u (%x), %d, %d) = %u (%X)\n", x, x, p, n, z, z);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是:
getbits(63892 (f994), 4, 3) = 5 (5)
我得到了部分内容,但我对"大局"感到困扰,主要是因为我不理解的比特(没有双关语).
我特别遇到问题的部分是补充部分:~(~0 << …
c ×3
objective-c ×3
arrays ×2
bit-shift ×2
c# ×2
operators ×2
.net ×1
clr ×1
cocoa ×1
complement ×1
gmail ×1
highlighting ×1
jit ×1
optimization ×1
pointers ×1
string ×1
undo-redo ×1