c语言入门自学零基础,c语言入门自学
第一篇前言。表情评价1。隐式类型转换2。算术转换3。运算符的属性汇总。
简介:表达式求值表达式求值的顺序部分由运算符的优先级和组合决定。
类似地,一些表达式的操作数可能需要在求值期间转换为其他类型。
1.隐式类型转换C的整数算术运算总是至少以默认整数类型的精度执行。
为了获得这种精度,表达式中的字符和短整型操作数在使用前被转换成普通整数,这种转换称为integer。
升职。
整数提升的意义:
表达式的整数运算要在CPU相应的运算器中执行,CPU中整数运算器(ALU)的操作数的字节长度一般是int的字节长度,也是CPU通用寄存器的长度。
所以,即使两个char类型加在一起,实际上也应该在CPU执行的时候,先在CPU中转换成整数操作数的标准长度。
CPU(通用CPU很难直接实现两个8位字节的直接相加(虽然机器指令中可能有这样的字节相加指令)。因此,表达式中长度可能小于int长度的各种整数值,在送到CPU执行运算之前,必须先转换成int或无符号int。
//示例1
int main() {
char a=5;
//00000000000000000000000000000101
//00000101 -a
char b=126
//00000000000000000000000001111110
//11111110 -b
char c=a b;
//00000101 -a
//01111110 -b
//000000000000000000000000000000001//塑料升降
//00000000000000000000000001111110
//00000000000000000000000010000011
//10000011-c
//
printf(%d\n ,c);//塑料提升
//111111111111111111111111000011-内存中的补码
//11111111111111111111111110000010
//10000000000000000000000001111101 - -125
返回0;
}
将a和b的值提升为正常整数,然后执行加法运算。
加法运算完成后,结果将被截断,然后存储在。
塑造的例子:
//示例1
int main()
{
char a=0xb6//10110110 //塑料升降
//11111111111111111111111110110110
//11111111111111111111111110110101
//10000000000000000000000001001010
//-0x4A
short b=0xb600
int c=0xb6000000
if(a==0xb6)
printf( a );
if(b==0xb600)
printf( b );
if(c==0xb6000000)
printf( c );
返回0;}
这时,a的值已经变了-0x4A。
b也是如此。
最终的输出结果是
//示例2
int main()
{
char c=1;
printf(%u\n ,sizeof(c));
printf(%u\n ,sizeof(c));
printf(%u\n ,sizeof(-c));
返回0;
}例2中,只要C参与表达式运算,就会发生塑形提升,表达式C就会被提升,所以sizeof( c)是4个字。
部分。
表达式-c在整形上也会有所改进,所以sizeof(-c)是4字节,但是sizeof是1字节。
2.算术转换如果一个运算符的操作数属于不同的类型,那么除非其中一个操作数转换为另一个操作数的类。
类型,否则操作无法进行。下面的层次系统称为普通算术变换。
长双份
两倍
漂浮物
无符号长整型
长整型
无符号整数
Int如果一个操作数的类型在上面的列表中较低,那么必须先将其转换为另一个操作数的类型,然后再执行。
算算。
警告:
但是算术转换要合理,否则会有一些潜在的问题。
浮点f=3.14
int num=f;//隐式转换,会有精度损失
3.有三个因素会影响运算符属性的复杂表达式的计算。
运算符的优先级。运算符的组合是否控制求值顺序。
两个相邻运算符中的哪一个将首先被执行?取决于他们的优先级。如果它们具有相同的优先级,则取决于它们的组合。
还有一些错误码,不能给出准确的计算顺序。
//表达式
c-c;
我不知道。先(c-1) (c-1)再加起来。
或c (c-1)
例如c=2
第一种方法的结果是1。
第二种方法的结果是3。
注:如上,运算符的优先级只能决定自减的运算先于的运算,我们没有办法得到。
众所周知,运算符左操作数的获取是在右操作数之前或之后计算的,因此结果是不可预测和不明确的。
是的。
//代码
#包含stdio.h
int main()
{
int I=1;
int ret=(I)(I)(I);
printf("%d\n ",ret);
printf("%d\n ",I);
返回0;
}
//尝试在linux环境和VS2013环境下的gcc编译器中执行,看结果。
VS2013环境的结果
看看产生不同结果的相同代码。为什么?
简单看一下汇编代码。可以分析清楚。
当执行这段代码中的第一个代码时,不确定是否会执行第三个,因为根据运算符的优先级和组合,无法确定第一个和第二个。
三个领导位置的顺序。
总结:如果我们写的表达式不能通过运算符的属性确定唯一的计算路径,那么这个表达式就是有问题的。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。