#include
int main()
{
int a = 3 + 5 / 6;
// 此处表达式的值由操作符的优先级决定
// 除号 的优先级高于 加号, 同时加号的优先级高于 赋值。
// 因此他的执行顺序为: 5 / 6 -----> 3 + 0 ------> a = 3
// 表达式的结果为3
printf("%d", a); // 3
return 0;
}
#include
int main()
{
int a = 3 + 5 + 3;
// 此时,优先级相同,加号 的结合性时从左向右
// 所以此时程序的执行顺序为 3 + 5 ----> 8 + 3 结果为11
printf("%d", a);
return 0;
}
同样,有些表达式的操作数在求值过程中可能需要转换为其他类型。
整型提升是按照变量的数据类型的符号位来提升的无符号整型提升,高位补零有符号整型提升,高位补符号位,负数则反码补 1,正数则反码补0 #include
int main()
{
char a = 5;
char b = 126;
// 字符在内存中存储的是ASCII值,本质上属于整型运算
// 要在CPU的运算器内运算, 小于 int 类型的必须先转换为 int 类型在进行运算
// 5 的二进制 00000000000000000000000000000101
// char a 的二进制,他只有 1 个字节,8 个比特位
// 00000101 ----- a
//
//126 的二进制 00000000000000000000000001111110
// char b 的二进制
// 01111110 ---- b
//
// 参与运算时,不足整型精度的要进行整型提升
//
// a 转换位 int 类型,进行整型提升
// char 为有符号类型,所以整型提升是,高位补符号位,即补0
// 00000000000000000000000000000101
//
// 整型提升转换为int,高位补0
// 00000000000000000000000001111110
// 相加
// 00000000000000000000000010000011
// char c 只能放8个比特位
// 10000011 ----- c
// 打印整型时,进行整型提升,符号位为 1,高位补1
// 11111111111111111111111110000011 ---- 补码
// 11111111111111111111111110000010 ---- 反码
// 10000000000000000000000001111101 ---- 原码 -----> -125
char c = a + b;
printf("%d", c); // -125
return 0;
}
int main()
{
char a = 0xb6;
short b = 0xb600;
int c = 0xb6000000;
if (a == 0xb6)
printf("a");
if (b == 0xb600)
printf("b");
if (c == 0xb6000000)
printf("c"); // c
// 程序的结果只打印 c
// a == 0xb6 和 b == 0xb600 也是表达式
// 在表达式运算时,shor char 类型需要整型提升
return 0;
}
#include
int main()
{
char c = 1;
printf("%u\n", sizeof(c));// 1
printf("%u\n", sizeof(+c)); // 4
printf("%u\n", sizeof(-c)); // 4
return 0;
}
long double
double
float
unsigned long int
long int
unsigned int
int
C语言表达式求值、隐式类型转换、算数转换以及一些问题表达式等的简单介绍。