C解释中的运算符优先级
Operator precedence in C explanation
我有以下代码:
#include<stdio.h>
void main(){
int x;
x=1%9*4/5+8*3/9%2-9;
printf("%d \n", x);
}
程序的输出是-9
。当我尝试根据运算符优先级 (* / %,Multiplication/division/modulus,left-to-right)
分解代码时,结果是 -8
。
代码分解如下:
x=1%9*4/5+8*3/9%2-9;
x=1%36/5+24/9%2-9;
x=1%7+2%2-9;
x=1+0-9;
x=-8;
谁能解释一下输出是怎样的 -9
。
x = 1%9*4/5+8*3/9%2-9
== 1*4/5+24/9%2-9
== 4/5+2%2-9
== 0+0-9
== -9
您似乎认为模运算的优先级低于乘法和除法,但实际上并非如此。而不是
x = (1 % ((9 * 4) / 5)) + (((8 * 3) / 9) % 2) - 9;
你所拥有的表达才是真正的代表
x = (((1 % 9) * 4) / 5) + (((8 * 3) / 9) % 2) - 9;
第一个被加数中的模在乘法和除法之前应用。
所有这些运算符*, /, %
都属于乘法运算符的范畴。它们的分组在 C++ 标准中有更清楚的描述(同样适用于 C 标准) 5.6 乘法运算符:
1 The multiplicative operators *, /, and % group left-to-right.
因此这个表达式语句
x=1%9*4/5+8*3/9%2-9;
相当于下面的语句
x = (( ( 1 % 9 ) * 4 ) / 5 ) + ( ( ( 8 * 3 ) / 9 ) % 2 ) - 9;
我有以下代码:
#include<stdio.h>
void main(){
int x;
x=1%9*4/5+8*3/9%2-9;
printf("%d \n", x);
}
程序的输出是-9
。当我尝试根据运算符优先级 (* / %,Multiplication/division/modulus,left-to-right)
分解代码时,结果是 -8
。
代码分解如下:
x=1%9*4/5+8*3/9%2-9;
x=1%36/5+24/9%2-9;
x=1%7+2%2-9;
x=1+0-9;
x=-8;
谁能解释一下输出是怎样的 -9
。
x = 1%9*4/5+8*3/9%2-9
== 1*4/5+24/9%2-9
== 4/5+2%2-9
== 0+0-9
== -9
您似乎认为模运算的优先级低于乘法和除法,但实际上并非如此。而不是
x = (1 % ((9 * 4) / 5)) + (((8 * 3) / 9) % 2) - 9;
你所拥有的表达才是真正的代表
x = (((1 % 9) * 4) / 5) + (((8 * 3) / 9) % 2) - 9;
第一个被加数中的模在乘法和除法之前应用。
所有这些运算符*, /, %
都属于乘法运算符的范畴。它们的分组在 C++ 标准中有更清楚的描述(同样适用于 C 标准) 5.6 乘法运算符:
1 The multiplicative operators *, /, and % group left-to-right.
因此这个表达式语句
x=1%9*4/5+8*3/9%2-9;
相当于下面的语句
x = (( ( 1 % 9 ) * 4 ) / 5 ) + ( ( ( 8 * 3 ) / 9 ) % 2 ) - 9;