(int_1 + =*pointer ++ = int_2 ++)<int_3是什么意思?

Ave*_*ain 4 c expression

我正在读这个早期的答案,里面有一段我无法理解的C代码.它基本上是这样的:

if((int_1 += *pointer++ = int_2++) < int_3) continue;
Run Code Online (Sandbox Code Playgroud)

我可以把它分解成这样的东西 -

这是什么意思?我可以谈谈这一点:

if((int_1 = int_1+ *pointer++ (unsure about this part))<int_3) continue;
Run Code Online (Sandbox Code Playgroud)

tem*_*def 10

所以对于初学者来说,这是非常非常糟糕的C代码.喜欢,可怕的C代码.就像,我已经在C中编写了很长时间,并且必须提取运算符优先级图表,因为我从来没有遇到类似这样糟糕的事情.所以没有理由写这样的东西 - 当然不是在生产代码中,并且希望不是作为一个类的一部分,因为你不应该永远不需要知道这个特定的运算符优先级的怪癖(来源:我教CS为生.)我甚至会说你引用的来源是不应该写这种方式的坏C代码.

但话说回来,让我们分解吧!这里的核心表达是

(int_1 += *pointer++ = int_2++) < int_3
Run Code Online (Sandbox Code Playgroud)

在该内部表达式中有两个赋值运算符,它们具有相同的优先级,从右到左具有相同的组.这意味着这相当于

(int_1 += (*pointer++ = int_2++)) < int_3
Run Code Online (Sandbox Code Playgroud)

这意味着

  1. 增加int_2并存储其旧值.
  2. 将该值存储在pointer指向的位置,然后将指针前进到下一个位置.
  3. 将该值添加到int_1.
  4. 然后看看该值是否小于int_3.

没有理由做这样的事情.写吧

int val = int_2;
*pointer = val;
int_1 += val;

int_2++;
pointer++;

if (val < int_3) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

是的!不要写这样的代码.永远.:-)

  • 这让我想起了我在80年代末/ 90年代早期工作过的雇主,他有一个软件,A)对业务的运作至关重要,B)没有证件,而且C)他们已经失去了源头. .解决方案:而不是弄清楚它做了什么,以及如何,他们只是一直称之为"魔术功能",很高兴知道即使他们不太确定如何也能做到.这是财富1000强企业,BTW ... :-) (3认同)