目录
一、运算符总表(包括优先级):
二、表达式
**********只要有表达式,就有计算结果! **********
在复杂的表达式中,通常含有多种运算符,优先级高的运算符先进行运算,例如根据运算符表,乘除运算优先级为3,加减优先级为4,因此先算乘除后算加减。
在优先级相同的情况下,需要看运算符表最右侧一列:结合方向。根据从左到右或者从右到左进行同优先级的表达式运算。
因此,在进行表达式运算时,先看优先级,再看结合性!!!
三、自增自减运算符
自增自减运算符:
int a, b,c,d;
a = b = 10;
c = a++;//先给后加
d = ++b;//先加后给
谁在前,先操作谁!
c = a++:先赋值后自增,结果为c=10,a=11;
该运算包括两个步骤:第一步:c=a 第二步:a=a+1
因此c得到a的初始值10,然后a自增1变成11
d = ++b:先自增后赋值,结果为d=11,b=11。
该运算包括两个步骤:第一步:b=b+1 第二步:d=b
因此b自增1变成11,然后把b的值11赋给d
a++:a在前,++在后 则:先给后加;
++a:++在前,a在后 则:先加后给 (--同理)
四、逻辑运算符(短路问题)
逻辑运算符:与;或 ;非。
非:!取向反逻辑,0相反为1,1相反为0.
与:&& 即并且,a&&b :a和b同为真才真,有一假即假。
或:|| 即或者,a||b :a和b有一真即真,同假才假。
&&优先级为11,||优先级为12 !优先于&&优先于||
短路问题:
结构优先,结果后算!!!
int a = 10, b = 10;
printf("%d\n", a++ > 10 && ++b > 10);
printf("a=%d,b=%d\n", a, b);
printf("%d\n", a++ > 10 || ++b > 10);
printf("a=%d,b=%d\n", a, b);
上段代码输出结果为:
a++执行后a自增为了11,++b明明先自增后赋值应该为11,可是即++b并没有执行,输出为初始值10,为什么会出现这种结果?
printf("%d\n", a++ > 10 && ++b > 10);
原因:&&在执行时,发现&&左侧的a++ >10 为0假,由于且的逻辑运算为有一假则假,表达式已经输出为0假,右侧就不会进行判断执行,因此++b表达式没有被执行。在&&左侧判断为假后,没有必要判断&&右侧表达式的真假,就不会进行右侧表达式的执行,这种现象称为短路。总结为:结构优先,结果后算!
printf("%d\n", a++ > 10 || ++b > 10);
在 || 逻辑运算中,|| 左侧的a++ > 10 已经判断为真,由于或的逻辑运算为有一真则真,表达式已经输出1真,则 || 右侧的++b也不会进行判断,++b也不会进行执行,结构优先,结果后算!
五、条件运算符(三目运算符 ? : )
条件运算符的书写格式:关系逻辑表达式 ? 判断为真的返回值 : 判断为假的返回值
int a=10;
char r ;
if (a%2==0)
{
r='T';
}
else
{
r='F';
}
上面的代码为if条件判断,条件为真返回T,条件为假返回F,可以将此使用条件运算符书写:
int a=10;
char r;
r = a%2 == 0 ? 'T' : 'F';
如果a是2的倍数,即a%2==0为真,则返回T,否则返回F。
条件运算符的嵌套:
使用条件运算符为:
int age = 21;
int sex = 1;
printf("%c\n", sex ? age >= 22 ? 'Y' : 'N' : age >= 20 ? 'Y' : 'N');
逗号运算符:表达式结果为最右侧结果
int a,b,c;
int m;
/*
逗号运算符的优先级别最低,()里用","连接了4个表达式。
整个()里称为一个,号表达式。逗号表达式返回值为最后一个表达式的计算结果,即m=12。
*/
m=(a=3,b=4,c=5,a+b+c);
printf("a=%d,b=%d,c=%d,m=%d",a,b,c,m);//打印结果:a=3,b=4,c=5,m=12