这些操作符都是双目操作符,前后有两个操作数,如2+3中,2和3是+的左右操作数。
+ | - | * | / | % |
---|---|---|---|---|
加 | 减 | 乘 | 除 | 取模(取余) |
#include
int main()
{
int a = 2 * 3 + 4 - 5 / 3 + 4 % 2;
printf("%d\n", a);//结果为9
return 0;
}
> | < | == | >= | <= | != |
---|---|---|---|---|---|
大于 | 小于 | 是否等于 | 大于等于 | 小于等于 | 不等于 |
【注】
(1)在判断整型变量i是否等于3时,可写为3 == i,常量在前,变量在后。
(2)在判断三个数是否相等时,绝对不可以写成if(X == X ==X),这种写法无论何时都为假。
#include
int main()
{
//若写为下列表达式,前两个的5 == 5,得到5等于5,结果为真,即为1
if(5==5==5)//而1不等于5,结果为假(0)
{
printf("equal");
}
return 0;
}
#include
int main()
{
int a = 5;
int b = 5;
int c = 5;
if (a==b==c)//同理
{
printf("equal\n");
}
else
{
printf("no equal\n");
}
return 0;
}
正确写法
#include
int main()
{
if(5==5 && 5==5)//此处注意if后侧不要使用分号
{
printf("equal");//输出结果为相等
}
return 0;
}
! | && | || |
---|---|---|
逻辑非 | 逻辑与 | 逻辑或 |
逻辑非! 优先级 高于 算术运算符;
|| && 优先级 低于 关系运算符。
在变量创建的时候给一个初始值叫初始化,在变量创建后,再给一个值,这叫赋值。
=:赋值操作符,是一个可以随时给变量赋值的操作符。
#include
int main()
{
int a = 5;
int b = 3;
int c = 2;
c = b = a + 3;//连续赋值,从右向左赋值
printf("%d", c);//结果输出为8,
return 0;
}
关于连续赋值,虽然C语言可以输出这种赋值,但是写出来的代码有时候不够容易理解,因此建议还是拆开写,更方便观察代码之间的关系。
+= | -= | *= | /= | // | >>= | <<= | &= | |= | ^= |
---|---|---|---|---|---|---|---|---|---|
=+ | =- | =* | =/ | 后期再介绍 |
前置++ | 后置++ | 前置– | 后置– | + | - |
---|---|---|---|---|---|
先加1后使用 | 先使用后加1 | 先减1后使用 | 后减1后使用 | 正号 | 负号 |
只有一个操作数,所以是单目操作符。
条件操作符也叫三目操作符,需要接受三个操作数,形式如下:
exp1 ? exp2 : exp3
条件操作符的计算逻辑是:如果exp1为真,exp2计算,计算结果是整个表达式的结果;如果exp1为假,exp3计算,计算的结果是整个表达式的结果。
逗号表达式,就是⽤逗号隔开的多个表达式。逗号表达式,从左向右依次执⾏。整个表达式的结果是最后⼀个表达式的结果。
exp1, exp2, exp3, …expN
//代码1
int a = 1;
int b = 2;
int c = (a>b, a=b+10, a, b=a+1);//逗号表达式 c是多少?
//a=1,b=2,c=2?
//a=12,b=12,c=13?
//代码2
if (a =b + 1, c=a / 2, d > 0)//表达式的结果是最后一个表达式的结果
//代码3
a = get_val();
count_val(a);
while (a > 0)
{
//业务处理
a = get_val();
count_val(a);
}
//如果使⽤逗号表达式,改写:
while (a = get_val(), count_val(a), a>0)
{
//业务处理
}
在操作符中还有一种特殊的操作符是 强制类型转换 。不到万不得已时不建议使用。
格式:(类型)
int main()
{
int a = 3.14;
//int是整型,a是整型,3.14是double型,两边类型不一样
//编译器会报警报
return 0;
}
//强制类型转换,可改为下列代码
int a = (3.14);
C语言的语句可分为一下五类:
一个分号就是一条语句,是空语句。
#include
int main()
{
;//是空语句,出现的情况是,这里需要一个语句,
//但是这个语句不需要做任何事情,就可以写一个空语句
return 0;
}
表达式语句就是在表达式后加上分号。
#include
int main()
{
int a = 20;
int b = 2;
b = a + 3;//表达式语句
printf("%d",b);
return o;
}
函数调用语句时,也会加上分号。
#include
int Add(int x, int y)
{
return x + y;
}
int main()
{
printf("do it\n");//函数调用语句
int ret = Add(2,3);//函数调用语句
}
成对括号中的代码就构成一个代码块,也被称为复合语句。
#include
void print(int arr[] , int sz)//函数的大括号中的代码也构成复合语句
{
int i = 0;
for(i=0; i<sz; i++)
{
printf("%d",arr[i]);
}
}
int main()
{
int i = 0;
int arr[10] = {0};
for(i=0; i<sz; i++)//for循环的循环体的大括号中的就是复合语句
{
arr[i] = 10-i;
printf("%d",arr[i]);
}
return 0;
}
控制语句用于控制程序的执行流程,以实现程序的各种结构方式(顺序结构、选择结构、循环结构)
可分为以下三种类型(后续详细介绍):
计算机中只能存储二进制数,即1和0,在对应的物理硬件上是高低电平。除常用的十进制,计算机还提供八进制和十六进制。
计算机中一个字节byte就是8个bit位,1KB=1024byte,1MB=1024KB,1GB=1024MB。
0,1 | 0-7 | 0-9 | 0-9,a-f |
---|---|---|---|
二进制 | 八进制 | 十进制 | 十六进制 |
当一个十进制数为123时,其二进制为0111 1011。
当二进制为0111 1011,转化为八进制。
二进制转化十六进制
格式:scanf(“%d”,&i); 其中&就是取地址的意思。
scanf() 常用的占位符如下,与 printf() 的占位符基本一致。
• %c :字符。
• %d :整数。
• %f : float 类型浮点数。
• %lf : double 类型浮点数。
• %Lf : long double 类型浮点数。
• %s :字符串。
• %[ ] :在方括号中指定一组匹配的字符(比如 %[0-9] ),遇到不在集合之中的字符,匹配将会停止。
#include
int main()
{
char name[11];
scanf("%10s",name);
return 0;
}
#include
int main()
{
int year = 0;
int month = 0;
int day = 0;
scanf("%d-%d-%d",&year,&month,&day);
printf("%d %d %d\n",year,month,day);
return 0;
}
如果用戶输入 2020-01-01 ,就会正确解读出年、月、日。问题是用戶可能输入其他格式,比如 2020/01/01,这种情况下,scanf() 解析数据就会失败。
为了避免这种情况,scanf()提供了一个赋值忽略符(assignment suppression character) * 。
只要把 * 加在任何占位符的百分号后面,该占位符就不会返回值,解析后将被丢弃。
#include
int main()
{
int year = 0;
int month = 0;
int day = 0;
scanf("%d%*c%d%*c%d",&year,&month,&day);
printf("%d %d %d\n",year,month,day);
return 0;
}
上面示例中,%d*C就是在占位符的百分号后面,加大了赋值忽略符 * ,表示这个占位符没有对应的变量,解读后不必返回。