鉴于以下财产声明:
@property NSInteger foo;
增量,减量和复合赋值运算符如何实际工作self.foo?
我的理解self.foo仅仅是实际存取方法的语法糖.所以self.foo不是直接访问一个NSInteger被foo调用的变量,而是调用它们:
- (void)setFoo:(NSInteger)foo;
要么
- (NSInteger)foo;
然而,下面的一组代码完全没问题,没有标记,编译得很好,并且完全返回预期的结果:
self.foo = 0;
NSLog(@"%d",self.foo); // prints 0
self.foo += 1;
NSLog(@"%d",self.foo); // prints 1
self.foo++;
NSLog(@"%d",self.foo); // prints 2
++self.foo;
NSLog(@"%d",self.foo); // prints 3
而且我认为假设前后修复操作符以及其他9个复合操作符的递减将完全符合您在NSInteger变量上直接使用它们时的预期,这可能是安全的.
我只是不明白为什么它是有效的,如果self.foo真的只是我上面提到的两种方法的语法糖.
如果我覆盖默认访问器以包含NSLog语句,那么我可以看到每个被调用的时间以及使用什么值,我可以看到首先调用getter然后调用setter.
这是否意味着以下内容:
self.foo += 1;
被有效地替换为:
[self setFoo:([self foo] + 1)];
在预编译期间?
编辑:那么,在汇编级别,self.foo += 1;和之间有什么区别self.foo = self.foo + 1;?如果我们不是在谈论一个属性,并且bar只是一个常规的int,在汇编级别,那么 …
properties objective-c increment operators compound-assignment
在C和C++代码中,特别是对于嵌入式系统,我经常偶然发现具有以下形状的赋值:
A |= B;
A &= B;
不确定是否相关,但A和B是寄存器.请参阅此处的示例:http: //processors.wiki.ti.com/index.php/Interrupt_Nesting_on_C28x#Example_Code 出现以下行:
IER |= 0x002;
IER &= 0x002;
但是,这些后续分配似乎与单个分配相同
A = B;
除了理论上,前者在某些情况下可以在两条线之间中断,但这似乎在大多数代码中都没有起到重要作用.
使用前者优于后者是否有优势,还是我看不到其他差异?
我想知道=+和+=(和其他任务操作员)之间是否存在差异.我试过,两个都做了同样的事情.那么有区别还是有约定?两者都有效,因为我的编译器没有检查标准吗?
编辑:我犯了一个错误.我在测试期间使用了不良输入,这让我觉得他们都在做同样的事情.原来他们是两件不同的事情.该+=运营商增加了右值到左值=+.=+只需将右值分配给左值+=.
在很多语言中 a = a + b 可以写成 a += b 在数值运算的情况下,a + b 与 b + a 相同,因此单个复合运算符就足够了。
此外, a = a - b 可以写成 a -=b 。
但是,ab 不等于 ba。因此,复合赋值运算符不适用于 a = b - a
那么,操作a = b op a(其中op可以是 +、-、*、/、% 和顺序很重要)是否有复合赋值运算符?
[非交换操作]
考虑以下伪代码(语言不可知):
int f(reference int y) {
   y++;
   return 2;
}
int v = 1;
v += f(v);
当评估时功能f发生变化y(即v)时v += f(v),v"冻结" 的原始值是否变为v"丢失"?
v += f(v); // Compute the address of v (l-value)
           // Evaluate v (1)
           // Execute f(v), which returns 2
           // Store 1 + 2 
printf(v); // 3
language-agnostic programming-languages pseudocode operators compound-assignment
public static void main(String[] args) {
    int A=5;
    int B=2;
    A *= B*= A *= B ;
    System.out.println(A);
    System.out.println(B);
}
当我在纸上计算出这个问题时,我发现了A=200 B=20,但是当我写下它以使其黯然失色时,它表明A=100 B=20
您能在纸上解释解决方案吗?
我试图自己解决Eclipse中的问题。
我们该如何解决?
我正在学习 C++,遇到了一个我不太理解的有趣困境。
我的目标是将字符串与 int 值的 char 表示形式连接起来,例如“a”。我的问题是:
string a = "bo";
a = a + 97;
还不能用
string a = "bo";
a += 97;
做。
我知道一个意思是添加,另一个意思是连接,但我已经看到了这样的例子
a += 1;
是相同的
a = a + 1;
有人可以解释一下吗?
当我container_of在Linux内核中检查宏的定义时,我看到一个复合语句作为宏定义,
#define container_of(ptr, type, member) ({                      \
    const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
    (type *)( (char *)__mptr - offsetof(type,member) );})
然而,我脑海中不明确的问题是哪个陈述被视为右值.显然,最后一个语句的结果用作右值,但为什么呢?
(type *)( (char *)__mptr - offsetof(type,member) );
例如,下面的代码示例是否合法?
int g_count = 0xFF;
#define GLOBAL_COUNT do {g_count;} while(0)
int main(int argc, char *argv[])
{
    int local;
    local = GLOBAL_COUNT;
    local = 0;
    GLOBAL_COUNT = local;
    return 0;
}
复合语句中变量的赋值规则是什么?
a = [ 'a' ]
b = [ 'b' ]
def c
    return [ 'c' ], [ 'd' ]
end
a, b += c # -> would be awesome, but gives syntax error
a, b = a + c.first, b + c.last # clunky and will call method twice...
# desired result
#
a == [ 'a', 'c' ]
b == [ 'b', 'd' ]
现在我经常发现自己写作:
t, tt = c
a += t
b += tt
但如果你问我,这有点难看.
编辑:单个元素数组似乎让一些人感到困惑,因为下面的几个答案只是不回答问题.让每个数组至少有2个元素让我更清楚了.
Edit2 …
使用+=运算符为属性赋值给了我NaNJavaScript.
此代码按预期工作:
> var result = {};
undefined
> result['value'] = 10;
10
> result['value'] += 10;
20
但是我们得到NaN:
> var test = {};
undefined
> test['value'] += 10;
NaN
为什么JavaScript的行为如此?如何在不初始化的情况下使其工作result['value'] = 0?
c ×3
operators ×3
c++ ×1
char ×1
embedded ×1
increment ×1
integer ×1
java ×1
javascript ×1
nan ×1
objective-c ×1
properties ×1
pseudocode ×1
ruby ×1
string ×1