c语言 : (冒号) 是什么?结果a为什么等于8

#include <stdio.h>

int main()
{
    int a ,m=10,n=9;
    a=(--m==n++)?
        --m:++n;

    printf("%d\n",a);
    
    return 0;

}

举个例子:

x>y ? x:y;  这个语句的意思就是比较x,y的大小,如果语句正确返回x,否则返回y.

题目中 a=(--m=n++)?  --m:++n; 意思也是一样,判断--m是否与n++的值相等,相等返回--m,否则返回++n,--m先执行--即等于9,n++先执行n=9再算++,所以等式成立都等于9,返回--m,--在前先执行,因为m此前执行了--,值为9,所以再执行--,值就为8了。

没有分号就是一行!!!!

 a=(--m=n++)?
        --m:++n;
//写作
 a = (--m=n++)?(--m):(++n);
//看起来是不是就熟悉了?
//是的 没错  就是问号表达式(又名 三目运算符)
//(条件)?(表达式1):(表达式2)
// 当条件为true返回表达式1  反之返回表达式2
// 需要注意的是  三目运算符中  表达式1 表达式2 返回的值类型必须一致
// 再分析一下题 
// 考了运算符优先级问题  首先你要知道 --m 和 m-- 的区别
// 若 m=1  a=(m--) 则 a = 1;
// 若 m=1  a=(--m)  则 a = 0;
// 那么
// 条件表达式 (--m = n++) 可拆分为=> --m; m = n; n++; => m = 9; n=10;条件表达式 = 9  
 a = (9)?(--m):(++n);
//(c/C++中非零为true)
// 所以执行 表达式1  => --m;  m=8  
 a = 8;