标签: compound-assignment

ObjC属性和C运算符

鉴于以下财产声明:

@property NSInteger foo;
Run Code Online (Sandbox Code Playgroud)

增量,减量和复合赋值运算符如何实际工作self.foo

我的理解self.foo仅仅是实际存取方法的语法糖.所以self.foo不是直接访问一个NSIntegerfoo调用的变量,而是调用它们:

- (void)setFoo:(NSInteger)foo;
Run Code Online (Sandbox Code Playgroud)

要么

- (NSInteger)foo;
Run Code Online (Sandbox Code Playgroud)

然而,下面的一组代码完全没问题,没有标记,编译得很好,并且完全返回预期的结果:

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
Run Code Online (Sandbox Code Playgroud)

而且我认为假设前后修复操作符以及其他9个复合操作符的递减将完全符合您在NSInteger变量上直接使用它们时的预期,这可能是安全的.

我只是不明白为什么它是有效的,如果self.foo真的只是我上面提到的两种方法的语法糖.

如果我覆盖默认访问器以包含NSLog语句,那么我可以看到每个被调用的时间以及使用什么值,我可以看到首先调用getter然后调用setter.

这是否意味着以下内容:

self.foo += 1;
Run Code Online (Sandbox Code Playgroud)

被有效地替换为:

[self setFoo:([self foo] + 1)];
Run Code Online (Sandbox Code Playgroud)

在预编译期间?


编辑:那么,在汇编级别,self.foo += 1;和之间有什么区别self.foo = self.foo + 1;?如果我们不是在谈论一个属性,并且bar只是一个常规的int,在汇编级别,那么 …

properties objective-c increment operators compound-assignment

7
推荐指数
1
解决办法
135
查看次数

随后在寄存器上使用OR和AND复合赋值运算符的目的

在C和C++代码中,特别是对于嵌入式系统,我经常偶然发现具有以下形状的赋值:

A |= B;
A &= B;
Run Code Online (Sandbox Code Playgroud)

不确定是否相关,但A和B是寄存器.请参阅此处的示例:http: //processors.wiki.ti.com/index.php/Interrupt_Nesting_on_C28x#Example_Code 出现以下行:

IER |= 0x002;
IER &= 0x002;
Run Code Online (Sandbox Code Playgroud)

但是,这些后续分配似乎与单个分配相同

A = B;
Run Code Online (Sandbox Code Playgroud)

除了理论上,前者在某些情况下可以在两条线之间中断,但这似乎在大多数代码中都没有起到重要作用.

使用前者优于后者是否有优势,还是我看不到其他差异?

c embedded compound-assignment

7
推荐指数
1
解决办法
141
查看次数

+ = vs = + C赋值运算符之间有什么区别?

我想知道=++=(和其他任务操作员)之间是否存在差异.我试过,两个都做了同样的事情.那么有区别还是有约定?两者都有效,因为我的编译器没有检查标准吗?

编辑:我犯了一个错误.我在测试期间使用了不良输入,这让我觉得他们都在做同样的事情.原来他们是两件不同的事情.该+=运营商增加了右值到左值=+.=+只需将右值分配给左值+=.

c assignment-operator compound-assignment

6
推荐指数
1
解决办法
3万
查看次数

a = b <operator> a 是否有复合赋值运算符(其中 <operator> 不是可交换的)?

在很多语言中 a = a + b 可以写成 a += b 在数值运算的情况下,a + b 与 b + a 相同,因此单个复合运算符就足够了。

此外, a = a - b 可以写成 a -=b 。

但是,ab 不等于 ba。因此,复合赋值运算符不适用于 a = b - a

那么,操作a = b op a(其中op可以是 +、-、*、/、% 和顺序很重要)是否有复合赋值运算符?

[非交换操作]

programming-languages compound-operator compound-assignment

5
推荐指数
1
解决办法
624
查看次数

复合赋值运算符,如果修改了值(同时)会发生什么?

考虑以下伪代码(语言不可知):

int f(reference int y) {
   y++;

   return 2;
}

int v = 1;

v += f(v);
Run Code Online (Sandbox Code Playgroud)

当评估时功能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
Run Code Online (Sandbox Code Playgroud)

language-agnostic programming-languages pseudocode operators compound-assignment

5
推荐指数
1
解决办法
48
查看次数

如何评估A * = B * = A * = B?

public static void main(String[] args) {
    int A=5;
    int B=2;

    A *= B*= A *= B ;

    System.out.println(A);
    System.out.println(B);
}
Run Code Online (Sandbox Code Playgroud)

当我在纸上计算出这个问题时,我发现了A=200 B=20,但是当我写下它以使其黯然失色时,它表明A=100 B=20

您能在纸上解释解决方案吗?

我试图自己解决Eclipse中的问题。

我们该如何解决?

java operators compound-assignment order-of-execution

5
推荐指数
2
解决办法
69
查看次数

为什么在 C++ 中,字符串和 int 的复合赋值有效,但字符串到 string + int 的复合赋值却不起作用?

我正在学习 C++,遇到了一个我不太理解的有趣困境。

我的目标是将字符串与 int 值的 char 表示形式连接起来,例如“a”。我的问题是:

string a = "bo";
a = a + 97;
Run Code Online (Sandbox Code Playgroud)

还不能用

string a = "bo";
a += 97;
Run Code Online (Sandbox Code Playgroud)

做。

我知道一个意思是添加,另一个意思是连接,但我已经看到了这样的例子

a += 1;
Run Code Online (Sandbox Code Playgroud)

是相同的

a = a + 1;
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下吗?

c++ string integer char compound-assignment

5
推荐指数
1
解决办法
56
查看次数

复合语句是否在C中左值(或右值)?

当我container_of在Linux内核中检查宏的定义时,我看到一个复合语句作为宏定义,

#define container_of(ptr, type, member) ({                      \
    const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
    (type *)( (char *)__mptr - offsetof(type,member) );})
Run Code Online (Sandbox Code Playgroud)

然而,我脑海中不明确的问题是哪个陈述被视为右值.显然,最后一个语句的结果用作右值,但为什么呢?

(type *)( (char *)__mptr - offsetof(type,member) );
Run Code Online (Sandbox Code Playgroud)

例如,下面的代码示例是否合法?

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;
}
Run Code Online (Sandbox Code Playgroud)

复合语句中变量的赋值规则是什么?

c compound-assignment

4
推荐指数
1
解决办法
1258
查看次数

是否有一个ruby oneliner来连接没有临时副本的嵌套数组?

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' ]
Run Code Online (Sandbox Code Playgroud)

现在我经常发现自己写作:

t, tt = c
a += t
b += tt
Run Code Online (Sandbox Code Playgroud)

但如果你问我,这有点难看.

编辑:单个元素数组似乎让一些人感到困惑,因为下面的几个答案只是不回答问题.让每个数组至少有2个元素让我更清楚了.

Edit2 …

ruby multidimensional-array compound-assignment

4
推荐指数
2
解决办法
101
查看次数

使用+ =分配在javascript中给出NaN

使用+=运算符为属性赋值给了我NaNJavaScript.

此代码按预期工作:

> var result = {};
undefined
> result['value'] = 10;
10
> result['value'] += 10;
20
Run Code Online (Sandbox Code Playgroud)

但是我们得到NaN:

> var test = {};
undefined
> test['value'] += 10;
NaN
Run Code Online (Sandbox Code Playgroud)

为什么JavaScript的行为如此?如何在不初始化的情况下使其工作result['value'] = 0

javascript nan compound-assignment

3
推荐指数
3
解决办法
3435
查看次数