C运算符

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

void main1(){
	int a = 7 / 3;  //整数和整数运算,结果为整数2,存储至整型变量a中
	printf("a = %d\n", a);  //输出a = 2

	float b = 7 / 3;  //整数和整数运算,结果为整数2,存储至浮点型变量b中
	printf("b = %f\n", b);  //输出2.000000  精确6位

	float c = 7 / 3.0;  //整数和浮点数运算,自动往高精度转换,结果为浮点数2.333333,存储至浮点型变量c中
	printf("c = %f\n", c);//输出2.333333  精确6位

	//求余运算  %两侧必须是整数
	printf("%d\n", 5 % 3);// 5= 3*1+2   余数是2
	printf("%d\n", 5 % -3);//5 =-3*(-1)+2   余数是2
	printf("%d\n", -5 % 3);//-5=3*(-1)+(-2)   余数是-2

	//不用求余运算符计算余数
	int x = -5;
	int y = 3;
	printf("%d\n", x - (x / y)*y);//利用x/y的整数运算求余
	system("pause");
}

void main2(){
	//整数的十位和个位互换 输入25,输出52
	int num, i, j;
	scanf("%d", &num);
	i = num % 10;
	j = num / 10;
	num = i * 10 + j;
	printf("the output -%d", num);
}
void main3(){
	//5++;
	//(n+3)++;
	//自增自减不能用于表达式或常量,优先级高于四则运算
	int num = 3;
	printf("%d",-num++);  //-3 等价于-(num++)
	printf("%d", num); //4
	int x, y;
	printf("%d", x+++y); //等价于 (x++)+y
}

void main4(){
	//5=5; 错误,常量,表达式都不能为左值,只有变量可以
	int a=10;
	int a, b,c;
	a += 1.3;  //等价于 a=a+1.3    a=11.3  因为a是整型,会发生类型转换,所以a=11;
	a = b = c = 5;  //赋值运算符是从右至左执行
}

void main5(){
	int a = 2;
	a %= 4 - 1; //a %=(4-1)  赋值运算符从右至左  a%=3    a=2;
	a += a *= a -= a *= 3;//  a += a *= a -= (a *= 3)  a += a *= a -=6  此时a=6
						//a += a *= (a -=6)    a += a *=0  此时a=0
						//  a += (a *=0)  a+=0     此时a=0
	//a=a+(a=a*(a=a-(a=a*3)))

	//逗号表达式是用逗号连接的多个表达式,他的优先级最低,从左至右依次求值,取最后的值
	//int a = 1, 2;  错误,因为赋值运算符优先级大于逗号运算符,该式会先计算a=1,此时逗号只是分格符
	int a = (1, 2);  //先计算1,再计算2,把2赋值给a
	//1、逗号可以连接多个语句
	printf("Hello"), printf("World"),getchar();   //输出HelloWorld
	//2、逗号起到间隔的作用
	printf("%d%d%d",10,20,36);  

	//关系表达式成立是1,不成立是0,顺序是从左至右
	1 < 2 < 3;  //输出1;实际计算流程为1<2成立,关系表达式为1,则该表达式为1<3,还是成立,整体表达式为1
	a = 1 < 2 == 2;  //a=0;   关系运算符优先级大于赋值,1<2成立,为0,0不等于2,关系表达式为0

	//<,>,<=,>=是同一优先级,比==,!=优先级高  同等运算符运算考虑结合性
	0 == 1 > 2;  //1    先看1>2,不成立为0,0==0,成立,结果为1
	//关系运算符操作数可以是字符,整数,实数
	//浮点类型一般不用做关系比较,因为float只能精确6-7位,double只能精确13-14位、
}

#define CMD "calc";
void main(){
	//字符串常量比较只能比较相等于不相等,比较的是他们的内存地址,内存地址相同则相等,不同则不等
	//定义常量时,常量不会被修改,系统会给一片固定的空间给常量,常量可以有多个引用,但其内存地址和内容都不会变
	//CMD 和"calc"两个常量指向了同一个地址
	CMD=="calc" ? system(CMD) : system("pause"); //打开cmd窗口 

	//不等的常量calc1会另外开辟内存空间,与calc不是同一地址
	CMD == "calc1" ? system(CMD) : system("pause");//不打开cmd窗口 

	//字符串变量,系统会给字符串变量分配空间,不同内存地址
	char str[]="calc";
	CMD == str ? system(CMD) : system("pause"); //不打开cmd窗口 
}

 

#include<stdio.h>
void main(){
	//运算的优先级(从高到低): 	!→ 算术运算符 → 关系运算符 → &&	→ || → 赋值运算符
	printf("%d\n", 5 && 3 > 4 );  //等价于 5 && (3>4)   输出0
	printf("%d\n", 0 || 5 && 3 > 4);  //等价于1 || (5 && (3 > 4))   输出1

	int a = 2; //逻辑或高于赋值运算符
	//prinrf("%d",1 || a = 3);  出错,等价于 (1||a)=3  (1||a)是1,是常量,常量不能为左值
	printf("%d\n", 1 || (a = 3));

     printf("%d,%d\n",3>2>1, 3<2 && 2>1); //输出0和1。第一个是关系表达式,第二个是与连接的两个关系表达式

     int b =5;//逻辑与的短路原则,从左至右执行,遇到0就不往后执行,因为已经可以确定整个表达式的值
     printf("%d\n",0 && ++b);   // 输出0,++b没有z执行
     printf("%d\n",b);//输出5
      int c =5;//逻辑或的短路原则,从左至右执行,遇到1就不往后执行,因为已经可以确定整个表达式的值
     printf("%d\n",1 || ++c);   // 输出1,++b没有z执行
     printf("%d\n",c);//输出5
     /*条件运算符仅优先于赋值运算符。
     条件运算符的结合方向为“自右到左”。
     例如:若a=5,b=6,c=7,d=8,求表达式
                    a>b?a:c>d?c:d 的值。
     按照条件运算符的结合性表达式可改写为:			a>b?a:(c>d?c:d)
     因此结果为:8
     条件运算符最终是一个值,会自动进行类型转换


     程序实体是内存中的一块可标识的区域,左值是左值表达式的简称,是指明一个程序实体的表达式。
     判断一个表达式是否左值的方法是看其能否放在等号的左边。能放在赋值号左边的表达式都是左值,它指明了一块内存区域,而赋值运算实质是改变这一区域内容的操作。
     但应注意,能放在赋值号左边的表达式都是左值,但左值并非一定可以放在赋值号左边,const常量是左值(初始化时),但不能将其放在赋值号左边,这是个例外。
     如“float a;”声明了一个浮点型变量a,则a是左值,因为它指明了一个程序实体,可放在赋值号的左边,
     但表达式“a+3”和“a=1”就不能放在赋值号的左边,因为他们是赋值寄存器中计算的,在内存中不存在他们的程序实体,对他们赋值没有意义
     */
     //

}

 

posted @ 2019-07-26 21:57  Coding_Changes_LIfe  阅读(322)  评论(0编辑  收藏  举报