运算符表达式和语句
1.1
基本运算符
1.1.1
=
数据对象:泛指数据在内存的存储区域
左值:表示可以被更改的数据对象
右值:能赋给左值的量
1.1.2
+
加
1.1.3
–
减
1.1.4
*
乘
1.1.5
/
除
1.1.6
%
取余数
1.1.7
+=
加等于
1.1.8
-=
减等于
1.1.9
*=
乘等于
1.1.10
/=
除等于
1.1.11
%=
取余等于
1.1.12
++
自加
1
,
i++
先计算表达式的值,然后再
++
,
++i
是先
++
,再计算表达式的值
1.1.13
--
自减一
1.1.14
逗号运算符
int a = 2; int b = 3; int c = 4; int d = 5; int i = (a = b, c + d); |
逗号表达式先求逗号左边的值,然后求右边的值,整个语句的值是逗号右边的值。
1.1.15
运算符优先级
优先级 | 运算符 | 结合性 |
1 | ++(后缀),--(后缀),()(调用函数),{}(语句块),.,-> | 从左到右 |
2 | ++(前缀),--(前缀),+(前缀),-(前缀),!(前缀),~(前缀),sizeof,*(取指针值),&(取地址),(type)(类型转化) | 从右到左 |
3 | *, /, % | 从左到右 |
4 | +,- | 从左到右 |
5 | << >> | 从左到右 |
6 | < > <= >= | 从左到右 |
7 | == != | 从左到右 |
8 | & | 从左到右 |
9 | ^ | 从左到右 |
10 | | | 从左到右 |
11 | && | 从左到右 |
12 | || | 从左到右 |
13 | ? | 从右到左 |
14 | =,*=,%=,+=,-=,<<=,>>=,&=,|=,^= | 从右到左 |
15 | ,(逗号运算符) | 从左到右 |
1.2
复合语句
{}
代码块
1.3
空语句
只有一个
;
号的语句就是空语句,空语句在
C
语言里面和合法的,并且是在某些场合必用的
1.4
类型转化
double f = (double)3 / 2; |
()为强制类型转化运算符
2
条件分支语句
2.1
关系运算符
在
C
语言中
0
代表
false
,非
0
代表真
2.1.1
<
小于
2.1.2
<=
小于等于
2.1.3
>
大于
2.1.4
>=
大于等于
2.1.5
==
等于
2.1.6
!=
不等于
2.2
关系运算符优先级
前四种相同,后两种相同,前四种高于后两种优先级
2.3
逻辑运算符
2.3.1
&&
与
当运算符左右都是真的时候,那么整个表达式的结果为真
只有左右有一个值为假,那么整个表达式的结果为假
2.3.2
||
或
当运算符左右只要有一个值是真的时候,那么整个表达式的结果为真
除非左右两个值都是假,那么整个表达式的结果为假
2.3.3
!
非
当值为真的时候,表达式为假,
当值为假的时候,表达式为真
2.4
if
单分支
If (
条件
)
{
//
复合语句
}
当条件是真的时候,复合语句才能被执行,如果条件为假的时候,复合语句不执行
2.5
if else
双分支
If (
条件
)
{
复合语句
1
}
Else
{
复合语句
2
}
如果条件为真,那么执行复合语句
1
,否则执行复合语句
2
2.6
if else if
多重
if
If (
条件
1)
{
复合语句
1
}
Else if
(条件
2
)
{
复合语句
2
}
Else if
(条件
3
)
{
复合语句
3
}
Else
{
复合语句
4
}
当有多个
else
的时候,
else
总是和上方最近的那个
if
语句配对。
2.7
switch
与
break,default
多重选择
switch (i) { case 0: printf("i = 0\n"); break;//跳出switch的复合语句块 case 1: printf("i = 1\n"); break; case 2: printf("i = 2\n"); break; case 3: printf("i = 3\n"); break; case 4: printf("i = 4\n"); break; default://如果有所条件都不满足,那么执行default语句 printf("error\n"); } |
什么时候用
if
,什么时候用
switch
当条件很复杂,一个条件中有
&&
,
||
,!存在,那么用
if
语句
如果条件很简单,但分支很多,那么适合用
switch
2.8
条件运算符?
一个求绝对值的例子
int i = -8; int x = (i < 0) ? -i: i; |
先求?左边的条件,如果条件为真,那么等于:左边的值,否则等于:右边的值
一个求最大值的例子
int c = (a > b) ? a : b; |
2.9
goto
语句与标号
无条件跳转
goto
不建议使用
goto
语句,
goto
语句会使你的程序可读性变的很差
代码:
#include <stdio.h>
int main()
{
int i = 3 < 5;
printf("i=%d\n", i); //在C语言中 true 为1 false 为0
/*
三元运算符
*/
goto end;//直接跳到中间代码 转到end处运行
int a = 1;
int b = 2;
int c = 0;
if (a < b)
{
c = b;
}else
{
c = a;
}
printf("c=%d\n", c);
c = (a < b) ? b : a; //与上面的ifelse 语句完全等价
printf("c=%d\n", c);
/*
goto 语句 :无条件跳转语句
*/
end://标号
printf("end!");
return 0;
}
3
循环语句
3.1
while
while
(条件),如果条件为真,循环继续,条件为假,循环结束
while
(
1
)、、是死循环的写法
3.2
continue
循环遇到
continue
语句,不再执行
continue
下面代码,而是直接返回到循环起始语句处继续执行循环
3.3
break
循环遇到
break
语句,立刻终端循环,循环结束
3.4
do while
do
复合语句
while (
条件
);
对于
do while
来讲,循环的复合语句至少可以被执行一次
对于
while
来讲,有可能复合语句一次执行机会都没有
3.5
for
for(int I = 0;i<10;i++)
3.6
循环嵌套
int i,j; for(i = 9; i > 0; i--) { for(j = 9; j > 0; j--) { printf("%d\t", i * j); } printf("\n"); } |
#include <stdio.h>
#define _CRT_SECURE_NO_WARNINGS
int main()
{
int i = 3 < 5;
printf("i=%d\n", i); //在C语言中 true 为1 false 为0
/*
三元运算符
*/
goto end;//直接跳到中间代码 转到end处运行
int a = 1;
int b = 2;
int c = 0;
if (a < b)
{
c = b;
}else
{
c = a;
}
printf("c=%d\n", c);
c = (a < b) ? b : a; //与上面的ifelse 语句完全等价
printf("c=%d\n", c);
/*
goto 语句 :无条件跳转语句
*/
end://标号
printf("end!");
/*
while 循环 do ... while(); 先执行语句,再执行判断while 条件, do...while 复合语句至少会执行一次
*/
int j = 0;
int sum = 0;
while (j <= 100)
{
j++;
if (j % 2)
{
continue;//continue 跳过下面的语句回到循环的开始执行 break直接退出循环 在for 循环中也是如此
}
sum += j;
}
printf("1+...+100=%d\n", sum);
/*
打印乘法口诀
*/
int x = 1;
int y = 1;
for (x=1;x <= 9;x++)
{
for (y=1;y <= x;y++)
{
if (x*y >= 10)
{
printf("%d * %d = %d ", y, x, x*y);
}else
{
printf("%d * %d = %d ", y, x, x*y);
}
}
printf("\n");
}
/*
用*打印一个树菱形
*/
int x1,x2; //x1 *最多行的*个数 x2 为总行数
do
{
printf("请输入*最多行的个数:");
scanf("%d", &x1); //这里可以自定义菱形边长
if (x1 % 2)
{
break;
}else
{
continue;
}
} while (1);
x2 = x1; //根据规律发现 x1 = x2
for (int i = 1; i <= x2;i++) //i在这里表示行数
{
if (i <= x2 / 2+1) //打印图形上半部分 从第一行到 第x2/2+1行
{
for (int j = 0; j <= x1 / 2 - i; j++) //打印" " ,第一行为 x1/2 -1 个 " "(空格),随行数i递减,第行第行减少一个 所有每行的个个数为 x1/2-i+1个
{
printf(" ");
}
for (int j = 0; j < 2 * i - 1;j++) //打印"*"随行数递增 *数与行数的关系为2i -1
{
printf("*");
}
printf("\n");
}
else //打印图形下半部分 从第 x2/2+2行开始到 第x2行
{
for (int j = 0; j <=i - x2 / 2 - 2 ; j++) //从第 x2/2+2 空格每行加1,x2/2+2 =1 ,根据等差数列:空格数 = i-(x2/2+2)+1
{
printf(" ");
}
for (int j = 0; j < x1 -2*( i-(x2 / 2+1)) ;j++)// 同理 x1-2-2*(i-(x2/2+2)) 整理得:
{
printf("*");
}
printf("\n");
}
}
//printf("%d", x1);
return 0;
}