Skip to content

程序设计和C语言(3)

1300字约4分钟

2024-07-07

10.初等运算符及单目运算符

优先级、操作数、结合方向--初等运算符优先级为1,单目运算符优先级为2 只有单目运算符和赋值运算符的结合方向是自右往左的

#include <stdio.h>
int main()
{
	//概念理解
	printf("%d,%d\n",1+2*3,(1+2)*3);
	int a = 1,b = 2,c = 3;
	printf("%d\n",a);         //学习目标(2)




	//!逻辑非运算符,求该操作数的逻辑反值,如果该操作数值为真,则整个表达式为假,否则整个表达式值为真
	printf("%d,%d,%d\n",!1,!9,!0);  //输出0,0,1
	
	//-负号运算符
	printf("%d\n",4*-3);            //乘号比负号的优先级低,括号可以省略
	return 0;
}

11.算术运算符及赋值运算符

乘号,除号,取余运算符的优先级为3;加号,减号的优先级为4;赋值运算符的优先级为14.



#include <stdio.h>
int main()
{
  //算术运算符
  printf("%d,%lf\n",5/2,5.0/2);   
  /*输出2,2.500000 除号运算符的操作数如果都为整型,那么其结果也为整型。会省略掉商后面的小数部分*/
	int a;
	printf("%d\n",a=5/4);




	printf("%d%d\n",5%3,4%9);
	/*  printf("%d\n",3.0%2);    报错。取余运算符两边的操作数必须为整型,否则会报错*/
	printf("%d,%d,%d\n",-13%3,13%3,-12%23);
	
	//赋值运算符
	int b=1,c=7;
	printf("%d\n",b+=2);
	 printf("%d\n",c/=3);
	
	//b+c=100;    错误,赋值运算符的左操作数比必须为一个左值,非常数
	
	//检测赋值表达式是一个常数还是一个左值
	a=1,b=2,c=3;
	printf("%d\n",(a = b)=c);   //输出3
	return 0;


}

12.逗号,关系及逻辑运算符

/*
学习目标:
(1)优先等级:逗号15(所有运算符中优先等级最低的);逻辑与11,逻辑或12,不等于7,关系运算符(除了等于与不等于之外)6
(2)在c语言中,优先级并不完全决定运算顺序;
1.只有4种运算符(&&,||,逗号,条件运算符)规定了运算顺序,必须自左至右
2.操作数的求值顺序,不同的编译器可能有所不同---不要依赖任何不可移植的操作,应避免出现
(3)&&和||都先 计算左边表达式的值,如果左边表达式的值能够确定整个表达式的值那么右边表达式的值就不会计算
*/
#include <stdio.h>
int main()
{
	//逗号运算符
	printf("%d\n",(1!=1,2==2,4));   //逗号运算符输出最右边表达式的值




	int a=0;
	a+=1,(a*=2);
	printf("%d\n",a);     //输出2而不是1,学习目标(2)-1
	
	//逻辑与运算符
	a=0;
	0&&(a=3);
	printf("%d\n",a);     //输出a的值为0,学习目标(2)-1
	
	//逻辑或运算符
	a=0;
	1||(a=3);
	printf("%d\n",a);     //输出a的值为0,学习目标(3)及(2)-1
	
	//学习目标(2)-2
	a=0;
	printf("%d\n",((a+=1)+(a*=2)));
	return 0;


}

13.条件运算符

/*
(1)条件运算符是c语言中唯一的三目运算符,其优先级为13
(2)c语言中条件运算符的运算方向也是必须从左至右的
*/
#include <stdio.h>
int main()
{
	1?printf("哈哈\n"):printf("呵呵\n");
	/*等价于
	if(1)
		printf("哈哈\n");
	else
		printf("呵呵\n");
	*/




	1?printf("1\n"),printf("2\n"):(printf("3\n"),printf("4\n"));   //加上圆括号控制多个语句
	/*等价于
	if(1)
	{
		printf("1\n");
		printf("2\n");
	}
	else
	{
		printf("3\n");
		printf("4\n");
	}*/
	
	1?printf("1\n"),printf("2\n"):printf("3\n"),printf("4\n");   //不加圆括号会得到另一个结果
	/*等价于
	if(1)
	{
		printf("1\n");
		printf("2\n");
	}
	else
	{
		printf("3\n");
	printf("4\n");
	}*/
	
	0?printf("A\n"):0?printf("B\n"):printf("C\n");
	/*等价于
	if(0)
		printf("A\n");
	else
	{
		if(0)
			printf("B\n");
		else
			printf("C\n");
	}
	*/	
	/*等价于
	if(0)
		printf("A\n");
	else if(0)
		printf("B\n");
	else
		printf("C\n");
	*/
	
	//学习(2)
	int a=0;
	0?(a+=2):2;     //程序会按照自左至右的顺序计算该表达式,并不会按照优先级高低,先去计算括号里面的
	printf("%d\n",a);


//	0?return 0;printf("123\n");  //error 表达式是数字和运算符的组合,return是关键字,所以return 0不是表达式
//	0?int x:printf("123\n");     //error int x不是表达式
	return 0;
}
void max(int a, int b)
{
	printf("%d\n",a>b?a:b);      //如果a>b成立,输出a,否则输出b
//等价于  a>b?printf("%d\n",a):printf("%d\n",b);
/*等价于上一句
	if(a>b)
		printf("%d\n",a);
	else
		printf("%d\n",b);
*/
}
序号关键字备注序号关键字备注
1auto2break
3case4char
5const6continue
7default8do
9double10else
11enum12extern
13float14for
15goto16if
17inlineC99新增18int
19long20registerC99新增
21restrict22return
23short24signed
25sizeof26static
27struct28switch
29typedef30union
31unsigned32void
33volatile34while
35_boolC99新增36_ComplexC99新
37_ImaginaryC99新增