今天发现了一段有趣的代码,如下:

printf("%d", (1, 2), 3);

好久没碰 C 语言了,看到这段代码有一种熟悉而又陌生的感觉。

那么结果是多少呢?

写个 Demo 跑一下就知道了呗:

#include <stdio.h>
int main () {
    printf("%d", (1, 2), 3);
    return 0;
}

编译运行,结果为 2

但是为什么呢?

先把这个表达式简化一下:

printf("%d", 2, 3);

编译运行一下可以发现,值同样为 2

这样就可以知道 (1,2) 的值就是 2,那么 3 呢?

其实使用 %d 来匹配的时候,会根据个数来进行匹配,也就是说当 %d 只有一个的时候,就匹配一个表达式,所以这里就匹配了 2

当有多个 %d 时,就继续匹配后面的表达式,这样的写法也更为熟悉:

printf("%d%d", 2, 3);

结果为 23

这个问题解决了,我们再来看看表达式 (1,2) 为什么等于 2

根据 C 语言语法,, 为语句分隔符,程序先后执行两条语句,因此表达式 (1,2) 的值是最末尾的表达式 2 的值,等于 2

这属于赋值表达式,我们可以看一个相似的代码:

int x = ((1, 2), 3);

x 的值为 3,因为按照语句执行顺序 3 为最后执行。

同理即可知道 (1,2) 的值就是 2