网站后台超链接怎么做,网站开发工程师 上海,3如何做网站推广,网站制作需要学多久文章目录 10.操作符的属性#xff1a;优先级、结合性10.1 优先级10.2 结合性 11.表达式求值11.1 整型提升11.2 算术转换11.3 问题表达式解析11.3.1 表达式111.3.2 表达式211.3.3 表达式311.3.4 表达式411.3.5 表达式5: 11.4 总结 10.操作符的属性#xff1a;优先级、结合性
… 文章目录 10.操作符的属性优先级、结合性10.1 优先级10.2 结合性 11.表达式求值11.1 整型提升11.2 算术转换11.3 问题表达式解析11.3.1 表达式111.3.2 表达式211.3.3 表达式311.3.4 表达式411.3.5 表达式5: 11.4 总结 10.操作符的属性优先级、结合性
10.1 优先级
这里的优先级我们是考虑相邻的操作符。
相邻的操作符优先级高的先执行。
我们可以用来改变优先级。 10.2 结合性
如果两个运算符优先级相同优先级没办法确定先计算哪个了这时候就看结合性了。
就看是从左向右算还是从右向左算。 11.表达式求值
11.1 整型提升
整型提升讨论的是表达式中char和short类型的值。
C语言中整型算术运算总是至少以缺省默认整型类型的精度来进行的。
为了获得这个精度表达式中的字符和短整型操作数在使用之前被转换为普通整型这种转换称为整型提升。
表达式中各种长度可能小于int长度的整型值都必须先转换为int或unsigned int然后才能送入CPU去执行运算。 如何进行整体提升呢 有符号整数提升是按照变量的数据类型的符号位来提升的无符号整数提升高位补0 int main() {char a 20;//00010100 - a//00000000000000000000000000010100 - achar b 130;//10000010 - b//00000000000000000000000010000010 - bchar c a b;//00010100 - a符号位是0//00000000000000000000000000010100 - a整型提升补码//10000010 - b符号位是1//11111111111111111111111110000010 - b整型提升补码//11111111111111111111111110010110 - c补码//10010110 - c截断//%d - 打印有符号的整数//11111111111111111111111110010110 - c整型提升补码//10000000000000000000000001101001 - c反码//10000000000000000000000001101010 - c原码-106printf(%d\n, c);return 0;
}打印
-106b和c的值被提升为普通整型然后再执行加法运算。
加法运算完成之后结果将被截断然后再存储于a中。 11.2 算术转换
算数转换讨论的是类型大于等于整型类型的其他类型。
如果某个操作符的各个操作数属于不同的类型那么除非其中一个操作数的转换为另一个操作数的类型否则操作就无法进行。下面的层次体系称为寻常算术转换。 long double double float unsigned long int long int unsigned int int 如果某个操作数的类型在上面这个列表中排名靠后那么首先要转换为另外一个操作数的类型后执行运算。也就是下面的向上转换。 11.3 问题表达式解析
11.3.1 表达式1
你觉得先算什么呢?
a*b c*d e*f表达式1在计算的时候由于 * 比 的优先级高只能保证 * 的计算是比 早但是优先级并不能决定第三个 * 比第一个 早执行。
所以表达式的计算机顺序就可能是 a*bc*dab cde*fab cd e*f 或者 a*bc*de*fab cdab cd e*f 11.3.2 表达式2
c --c;同上操作符的优先级只能决定自减 -- 的运算在 的运算的前面但是我们并没有办法得知 操作符的左操作数的获取在右操作数之前还是之后求值所以结果是不可预测的是有歧义的。
例如 int c 5; –c是先算的算完后c4那么左边的c会不会也随之改变值呢 那么是54还是44呢 11.3.3 表达式3
int main()
{int i 10;i i-- - --i * ( i -3 ) * i i;printf(i %d\n, i);return 0;
}这个和表达式二有点像而且不方便读写。
表达式3在不同编译器中测试结果也不一样。 11.3.4 表达式4
#include stdio.h
int fun()
{static int count 1;return count;
}
int main()
{int answer;answer fun() - fun() * fun();printf( %d\n, answer);//输出多少return 0;
}虽然在大多数的编译器上求得结果都是相同的。
但是上述代码 answer fun() - fun() * fun(); 中我们只能通过操作符的优先级得知先算乘法再算减法。
函数的调用先后顺序无法通过操作符的优先级确定。 11.3.5 表达式5:
#include stdio.h
int main()
{int i 1;int ret (i) (i) (i);printf(%d\n, ret);printf(%d\n, i);return 0;
}同样的代码在不同编译器产生了不同的结果。
这段代码中的第一个 在执行的时候第三个是否执行这个是不确定的因为依靠操作符的优先级和结合性是无法决定第一个 和第三个前置 的先后顺序。 11.4 总结
即使有了操作符的优先级和结合性我们写出的表达式依然有可能不能通过操作符的属性确定唯一的计算路径那这个表达式就是存在潜在风险的建议不要写出特别复杂的表达式。