文章概述:主要阐明复杂式子中c语言运算符的计算顺序,它不仅仅与优先级有关系,还与计算机执行指令的机制有关。
1.运算符优先级列表
1)如果是嘉庚的学生,请参考书本《c语言程序设计教程》郭一晶主编p43 2)另外还可以参考C语言运算符优先级列表(超详细)
2.程序中不同优先级的处理方式
按照上文阐述,优先级高的式子具有优先计算的特点,那么,
#include<stdio.h>
int main(){
int a=b,(int b=3);
printf("a:%d",a);
return 0;
}
观察
int a=b,(int b=3);
按照优先级划分,‘,’(逗号表达式)的优先级低于“()”(括号),因此 int b=3 应该先执行,a=b可以执行。 这显然很荒谬,这样执行后报错: 错误显示b是第一次使用,显然程序的读取顺序仍然是从左到右,并不是单纯看运算符的优先级。
所以,优先级到底是怎么发生作用的呢?
举一个例子:
a=b+c*d;
按照数学的说法,“*”的优先级高于“+”,因此先执行c*d ,但在c语言程序里,程序仍然是从左到右读取的,因此实际优先级发挥的作用可以看作,如图:
分析:优先级高在程序里并不会优先执行,而是将运算符两边的变量结合的更紧密。程序依然是从左往右读取的,只是读取过程中,变量更紧密的一边会自成整体。
所以上图的程序执行方式为(依然是丛左向右读取程序): 1.读取a= 2.由于= 结合方向为自右向左,因此需要先读取右边的b 3.读到b 时,发现= 无法将b 结合过来,因为b 右边的+ 优先级高于= ,所以无法执行a=b ,必须将b+右边 看成整体,因此下一步读取这个整体。 4.读取整体中的b+c 时,发现+ 的优先级小于c 右边的* 号,因此+ 不得不把c*d 看成整体后再参与运算。因此要先解决掉c*d 5.至此程序读取完毕。内存把c*d 当做整体和b 相加,再把加起来的值赋值给a 。
又如:
int a=3,b=4,d=9;
b=a>b||a++;
第二行根据优先级应当看做: 从图中可以看出a++ 由于优先级最高,因此最紧密,对其他运算来说,它是个整体,除非有其他运算符比它优先级高,将它分开。但还不是优先级高就先执行,依然从左到右边。 可以将其改成这样:
b=( (a > b) || (a++))
但是程序依然是从左往右读取。
|