运算优先级记忆
从下向上:
逗号是最低的; |
---|
所有和赋值运算有关的运算符优先级都是最低的。(=,<=,+=,<<=等等) |
与、或等逻辑运算(但非运算等级是第二位的) |
表达式之间的关系运算(==,!=,<=,>=) |
四则运算(数之间的运算,包括<<,>>)。 |
单目运算符(++,–,~,!)等 |
与指针有关的,数组有关的([],&,->)。 |
运算符部分特殊
1.||
和&&
运算符,记着由于为了简化运算,降低运算时间。所以说,.当前一个表达式结果为真时,||
后面的表达式不做计算,可以当做后面的表达式不存在了。直接忽略。同理,当前一个表达式结果为假时,&&
运算符后面的表达式可认为不存在。
2. ?:
是右结合。如a>b?a:c<d?c:d
等价于a>b?a:(c<d?c:d)
优先级错题
题目:设有定义语句
int x[6]={2,4,6,8,5,7};
int *p=x;
int i=0;
要求依次输出x数组6个元素中的值,能完成此操作的语句是:for(i=0;i<6;i++) printf("%2d",*(p++));
分析:
尽管()是最高优先级,但是仅仅只是优先将()内的符号进行结合,而不表示一定先对()内进行计算。所以尽管有括号(),但由于*
和++
优先级相同,而且是右结合,所以事实上*(p++)
等同于*p++
。
题目:设x、y、t均为int型变量,则执行语句后,变量t和y的值分别为__。
t=3;
x=y=2;
t=x++||++y;
分析:
1.||
运算符与|
。前者是判断表达式最后的结果是真是假,所以只可能是0/1。我开始都没在题目答案中找到
t=1
t
=
1
这个答案,这也是答错的重要原因。
2. 运算优先级,赋值运算优先级是很低的。
3. ||
,只要前一个表达式为真,则后面一个表达式不做运算了;不然才会继续进行后面表达式的计算。同理&&
,若前一个表达为假,则不会继续对后面的表达式进行计算了。
答案:
t=1,y=2
t
=
1
,
y
=
2
.