1.表达式
何为表达式呢 其实就是由一个或者多个运算对象和零个或者多个运算符组成的东西
诸如:5 + 10, 5, +5之类都称得上表达式
运算符和运算对象进行运算操作以后必然有一个结果 这个结果就是该表达式的结果
何为表达式语句呢 其实就是在表达式的基础之上在其尾部添加一个分号;即可 诸如:5 + 10; 5; +5;
在C语言中 表达式不能够单独存在 只能够以表达式语句的形式存在
int main() {
printf("%d", 5 + 10);// 15
return 0;
}
上述这个案例中 5 + 10明显是一个表达式 他为什么不需要加上;呢 这是因为他并非单独存在 而是作为函数调用表达式语句的子表达式存在的
2.加法运算符
+为加法运算符 左右两边都需要一个运算对象 构成加法运算符表达式
表达式的结果就是左右两边表达式结果的和
int main() {
int a = 10;
int b = 20;
int c = a + b;
printf("%d", c);// 30
return 0;
}
3.减法运算符
-为减法运算符 左右两边都需要一个运算对象 构成减法运算符表达式
表达式的结果就是左右两边表达式结果的差
int main() {
int a = 10;
int b = 20;
int c = b - a;
printf("%d", c);// 10
return 0;
}
4.符号运算符
+、-除了作为加、减法运算符存在之外 还可以以符号的形式存在
其右边需要一个运算对象 以构成符号运算符表达式
表达式的结果:正号运算符表达式为运算对象的值 负号运算符表达式为运算对象的值的相反数
int main() {
int a = 10;
int b = 20;
printf("%d %d", +a, -b);// 10 -20
return 0;
}
5.乘法运算符
*为乘法运算符 左右两边需要一个运算对象 以构成乘法运算符表达式
表达式的结果就是左右两边表达式结果的积
int main() {
int a = 10;
int b = 20;
printf("%d", a * b);// 200
return 0;
}
6.除法运算符
/为除法运算符 左右两边各需要一个运算对象 以构成除法运算符表达式
表达式的结果为左右表达式的商
int main() {
int a = 10;
int b = 20;
printf("%d", b / a);// 2
return 0;
}
需要注意当出现整型无法整除这种情况的时候 其结果依然是整数 只有当运算对象出现了浮点数 其结果才是浮点数
int main() {
int a1 = 5;
float a2 = 5;
int b = 2;
float c1 = a1 / b;
float c2 = a2 / b;
printf("%f %f", c1, c2);// 2.000000 2.500000
return 0;
}
7.求余运算符
%为求余运算符 左右两边都需要一个运算对象 以构成求余运算符表达式
表达式的结果是左表达式和右表达式做除法之后的余数
int main() {
int a = 5;
int b = 2;
printf("%d", a % b);// 1
return 0;
}
8.赋值运算符
=为赋值运算符 左右两边各需要一个运算对象 以构成赋值运算符表达式
表达式的结果是右表达式的值
该表达式的作用除了可以获取一个结果之外 还可以将右表达式的值传递给左表达式
1.赋值和初始化
初始化是声明变量的同时为其提供初始值
赋值是为变量提供一个新值
从另一方面 也可以说明他们的区别
int main() {
int a = 10;// 初始化 这个表达式涉及到的=并不是赋值运算符 因为=左边不是运算对象 而是一个声明
a = 5;// 赋值 这个表达式涉及到的=才是赋值运算符
return 0;
}
2.求一个赋值表达式的结果
int main() {
int a = 5;
printf("%d", a = a + 5);
return 0;
}
对于a = a + 5表达式 首先求子表达式 即加法表达式的结果 即10 然后求赋值表达式的结果 即10 并且将10传递给a
3.不能给常量赋值
int main() {
"HelloWorld" = "a";// error
1 = 2;// error
return 0;
}
9.自增、自减运算符
++为自增运算符 --为自减运算符 自增自减运算符仅需要一个左边或者右边的表达式 以构成自增运算符表达式或者自减运算符表达式
运算符在左边称之为前缀模式 诸如:++i、–i
运算符在右边称之为后缀模式 诸如:i++、i–
1.前缀模式
int main() {
int a = 10;
int b = 10;
printf("%d\n", ++a);// 11
printf("%d\n", a);// 11
printf("%d\n", --b);// 9
printf("%d\n", b);// 9
return 0;
}
前缀表达式的结果:
前缀自增表达式的结果就是运算对象的值+1
前缀自减表达式的结果就是运算对象的值-1
前缀表达式除了产生结果以外 还会对运算对象产生操作
对运算对象产生的操作:
前缀自增表达式将运算对象+1
前缀自减表达式将运算对象-1
2.后缀模式
int main() {
int a = 10;
int b = 10;
printf("%d\n", a++);// 10
printf("%d\n", a);// 11
printf("%d\n", b--);// 10
printf("%d\n", b);// 9
return 0;
}
后缀表达式的结果:
后缀自增表达式的结果是运算对象的值
后缀自减表达式的结果是运算对象的值
后缀表达式除了产生结果以外 还会对运算对象产生操作
对运算对象产生操作:
后缀自增表达式将运算对象+1
后缀自减表达式将运算对象-1
3.自增、自减表达式操作运算对象的时机
不同的编译器有着不同的行为
对于下面同一段代码 不同的编译器会产生不同的结果
int main() {
int a = 1, b;
b = a++ + a++ + a++;
printf("%d %d", a, b);
return 0;
}
visual studio执行这一段代码的结果为4 3
而clion执行这一段代码的结果是4 6
详细解析一下visual studio关于这段代码的具体执行过程:
1.第一个a++:a的值为1 后缀自增表达式的结果为1 此外不进行任何操作
2.第二个a++:a的值为1 后缀自增表达式的结果为1 此外不进行任何操作
3.第三个a++:a的值为1 后缀自增表达式的结果为1 此外不进行任何操作
4.b的值为1 + 1 + 1 = 3 然后在对操作对象a执行刚才未完成的三次加1操作 即a = 4
详细解析以下clion关于这段代码的具体执行过程:
1.第一个a++:a的值为1 后缀自增表达式的结果为1 此外对a执行+1操作
2.第二个a++:a的值为2 后缀自增表达式的结果为2 此外对a执行+1操作
3.第三个a++:a的值为3 后缀自增表达式的结果为3 此外对a执行+1操作
4.b的值为1 + 2 + 3 = 6 a的值为1 + 1 + 1 + 1 = 4
4.表达式操作运算对象的最晚时机
刚才的需求 不同的编译器操作对象的时机是各不相同的 visual studio是在求出整个表达式的值以后一并操作对象 clion则是在求出每一个子表达式的值以后就操作一次对象
但是有一点是必须知道的 表达式中操作运算对象是有一个最晚时机的 就是会在求出完整表达式之后对操作对象执行操作
而讲究表达式中操作运算对象的时机的行为除了有自增、自减 还有赋值
这些表达式中 除了计算表达式的值以外 就是操作运算对象
建议不要对同一个变量重复进行自增或者自建操作 因为不同的编译器有着不同的行为
10.一元运算符、二元运算符
一元运算符:只有一个运算对象的运算符
二元运算符:有两个运算对象的运算符