1c语言入门2常量、变量和表达式5表达式 (1)
- 格式:doc
- 大小:54.50 KB
- 文档页数:5
六大表达式一、算术表达式(数学表达式)(1)运算符:数学:{} [] () + - * / + -C:()、+/-、* / %、+/-正负(2)单目、双目运算符单目:一个操作数 +5 -9双目:两个操作数 5+6 7*8(3)%:<1>双目运算符<2>操作数:两个数都是整型资料1%2<3>奇数: x%2!=0偶数: x%2==0整除: %(4)在算术运算中,如果运算符两端的类型都是整型数据,那么结果是整型资料1/2 0 5/3 1 8/9 0 9/8 1在算术运算中,如果运算符两端的类型不一致,向空间大的一方转化. 1/2.0 1.0/2.0 0.5 1.0/5 1.0/5.0 0.22 4(5)优先级:(6)结合性:(7)使用多层括号,一律使用小括号(8)强制性类型转化格式:(类型名)表达式注:1)类型名括号不能省2)不存在四舍五入2.赋值表达式(1)格式变量名=表达式(2)变数的实质:存储单元(3) =:赋值号==:等号优先级:只比逗号高结合性:自右向左(4)表达式:常量、变数、六大表达式(5)在赋值表达式中,赋值号的左端只能为变量名5+8=a b=a(6) int x=2,y=3;x=y:将变量y所代表的单元中的值取出来赋值给变量x所代表的单元中x=x+1:将变量x所代表的单元中的值取出来+1赋值给变量x代表的单元中x=x:左x: 代表x所标识的单元右x:将变量x所代表的单元中的值取出来单元=值(7)变量中的值在不断进行更新x=2x=3x=99(8)复合赋值表达式(算术和赋值) 1)运算符:*= /= %= += -=2)优先级:与”=“同级3)结合性:自右向左4)复合赋值有隐含小括号功能3.关系表达式(1)逻辑值平时 C 5678 -2真非0 1假 0 0(2)运算符> >= < <= == != (3)优先级> >= < <= == != (4)结合性自左向右(5)结果:逻辑值5<6 7>94.逻辑表达式(1)运算符!:(非补集)&&:(与交集)||:(或者并集)(2)!:单目运算&& ||:双目(3)优先级高到低:! && ||(4)结合性!:自右向左&& ||:自左向右(5)使用!0 1 !非0 0非0&&非0 1 1||1 1非0&&0 0 1||0 10&&非0 0 0||1 10&&0 0 0||0 0(6)结果:逻辑值(1,0)(7)数学表示方式|x|<=9 -9<=x<=9 x>=-9&&x<=9|x|>=9 x>=9或x<=-9 x>=9||x<=-9(8)断路问题<1> 在逻辑&&运算中,如果表达式1已经为逻辑假,表达式2不用执行,该表达式值为逻辑假<2>在逻辑||运算中,如果表达式1已经为逻辑真,表达式2不用执行,该表达式值为逻辑真5.条件表达式格式:表达式1?表达式2:表达式3(1)三目运算(2)运算过程:表达式1为真,执行表达式2表达式1为假,执行表达式36.逗号表达式(1)格式:表达式1,表达式2,表达式3,表达式4,……,表达式n (2)优先级:所有运算符中优先级最低(3)结合性:自左向右int a=8;a+=3,a=5,a+3; ?a 表达式的值?附:<1>++ 、--1>功能++:+1 自动赋值--: -1 自动赋值2>单目运算3>操作数可以放在运算符的右边也可以放在运算符的左边 i++ ++i i-- --i4>操作数可以为整型、实型的变量 2++ 2=2+1 错i++ i=i+1 ++i i=i+1i-- i=i-1 --i i=i-15>表达式值和变数值int i;表达式值变数值i=5 i++ 5 6i=5 ++i 6 6i=5 i-- 5 4i=5 --i 4 4只要给出式子的整体(i++,--i)则使用的是表达式的值;如果给出变量名,使用的是变量值int i=5;j=40/i++; j=40/6 66>-i++:-(i++) j=-i++; j=-5 i=6<2>所有运算符的优先级(六个表达式)高=》低() ++/-- !算术表达式关系表达式逻辑表达式条件表达式赋值表达式逗号表达式。
C语⾔详解-表达式和语句1. 什么是表达式?C语⾔中的表达式⼀种有值的语法结构,它由运算符将变量、常量、函数调⽤返回值结合⽽成。
1.1 变量变量名本⾝是⼀个表达式,表达式的值是变量当前的值。
复杂的表达式由[], ->, ., 和单⽬运算符*构成。
1.2 常量常量名本⾝是⼀个表达式,字⾯常量也是表达式。
对于这两者,表达式的值是常量当前的值。
1.3 函数调⽤对于返回值不为void的函数,对它的正确调⽤也是表达式。
表达式的值为函数的返回值。
1.4 操作符运算符⽤于连接表达式中的值。
以下是C语⾔中的运算符,运算符的优先级,及运算符的结合顺序OrderCategory Operator Operation Associativity1Highest precedence( )[ ]→: :.Function call L → RLeft to Right2Unary!~+-++- -&*Size of Logical negation (NOT)Bitwise 1’s complementUnary plusUnary minusPre or post incrementPre or post decrementAddressIndirectionSize of operant in bytesR → LRight -> Left3Member Access.*→*DereferenceDereferenceL → R4Multiplication*/%MultiplyDivideModulusL → R5Additive+-Binary PlusBinary MinusL → R6Shift<<>>Shift LeftShift RightL → R7Relational<<=>>=Less thanLess than or equal toGreater thanGreater than or equal toL → R8Equality==!=Equal toNot Equal toL → R9Bitwise AAND&Bitwise AND L → R 10Bitwise XOR^Bitwise XOR L → R 11Bitwise OR|Bitwise OR L → R 12Logical AND&&Logical AND L → R 14Conditional? :Ternary Operator R → L15Assignment=*=%=/=+=-=&=^=|=<<=>>=AssignmentAssign productAssign reminderAssign quotientAssign sumAssign differenceAssign bitwise ANDAssign bitwise XORAssign bitwise ORAssign left shiftAssign right shiftR → L>>=Assign right shift16Comma,Evaluate L → R1.5 实例/* 变量常量表达式 */asum10.5PI/* 算术表达式 */a + ba -b + ca *b + 'A'a /b -c + 10i++ + i++ + ++i/* 赋值表达式 */a = ba *=b += 20a =b =c = 10a = (b=4) / (c=2)/* 逗号表达式 */1+2, 3+4(10, a*5), a+10/* 关系表达式 */x == yx <= yx != y/* 逻辑表达式 */10 && 200 || 1(a>b) && (!0)/* 复合表达式 */x = ( y = (a + b), z=10)/* 表达式的应⽤ */if( !100 ) //!100为逻辑表达式printf("expression show!");for(int i=10; i<10; i++)//for包含3个表达式,分别为i=10 i<10 i++printf("expression show!");while( 1 ) //1也是⼀个表达式{printf("death loop!");}2. 语句语句指的是当程序运⾏时执⾏某个动作的语法结构。
编程中变量和常量的运算与表达式在计算机编程中,变量和常量是非常重要的概念。
它们用于存储和表示数据,在程序的执行过程中起着关键的作用。
本文将探讨变量和常量的运算与表达式,以及它们在编程中的应用。
一、变量和常量的定义和赋值在编程中,变量是一种用于存储数据的容器。
它们可以存储各种类型的数据,如整数、浮点数、字符串等。
变量的值可以在程序执行过程中发生变化,因此称之为“变量”。
常量则是一种固定不变的值。
它们在程序执行过程中不会发生变化,因此称之为“常量”。
常量一般用于表示固定的数值、字符或者字符串。
在编程中,我们需要为变量和常量赋值。
赋值是将一个值存储到变量或常量中的过程。
例如,我们可以将整数值10赋给一个名为“num”的变量,或者将字符串“Hello World”赋给一个名为“message”的常量。
二、变量和常量的运算在编程中,我们可以对变量和常量进行各种运算。
常见的运算包括数学运算、逻辑运算和比较运算。
1. 数学运算数学运算是对变量和常量进行基本的数学操作,如加法、减法、乘法和除法等。
例如,我们可以将两个整数相加,并将结果存储到一个变量中。
这样的运算可以用于计算、处理数据等。
2. 逻辑运算逻辑运算是对变量和常量进行逻辑操作,如与、或、非等。
逻辑运算常用于条件判断和控制流程。
例如,我们可以使用逻辑运算符“与”(&&)来判断两个条件是否同时满足。
3. 比较运算比较运算是对变量和常量进行比较操作,如大于、小于、等于等。
比较运算常用于条件判断和排序等场景。
例如,我们可以使用比较运算符“大于”(>)来比较两个数的大小。
三、表达式在编程中,表达式是由变量、常量和运算符组成的组合。
它们可以用于计算和表示复杂的逻辑和数学关系。
表达式可以包含多个变量和常量,并通过运算符进行运算。
例如,我们可以使用表达式“num1 + num2”来表示两个变量的相加操作。
这样的表达式可以用于计算两个数的和,并将结果存储到一个变量中。
第 2 章常量、变量和表达式3. 变量变量(Variable)是编程语言最重要的概念之一,变量是计算机存储器中的一块命名的空间,可以在里面存储一个值(Value),存储的值是可以随时变的,比如这次存个字符'a'下次存个字符'b',正因为变量的值可以随时变所以才叫变量。
常量有不同的类型,因此变量也有不同的类型,变量的类型也决定了它所占的存储空间的大小。
例如以下四个语句定义了四个变量fred、bob、jimmy和tom,它们的类型分别是字符型、整型、浮点型:char fred;int bob;float jimmy;double tom;声明和定义C语言中的声明(Declaration)有变量声明、函数声明和类型声明三种。
如果一个变量或函数的声明要求编译器为它分配存储空间,那么也可以称为定义(Definition),因此定义是声明的一种。
在接下来几章的示例代码中变量声明都是要分配存储空间的,因而都是定义,等学到第 2 节“定义和声明”我们会看到哪些变量声明不分配存储空间因而不是定义。
在下一章我们会看到函数的定义和声明也是这样区分的,分配存储空间的函数声明可以称为函数定义。
从第 7 章结构体开始我们会看到类型声明,声明一个类型是不分配存储空间的,但似乎叫“类型定义”听起来也不错,所以在本书中“类型定义”和“类型声明”表示相同的含义。
声明和语句类似,也是以;号结尾的,但是在语法上声明和语句是有区别的,语句只能出现在{}括号中,而声明既可以出现在{}中也可以出现在所有{}之外。
浮点型有三种,float是单精度浮点型,double是双精度浮点型,long double 是精度更高的浮点型。
它们之间的区别和转换规则将在第 15 章数据类型详解详细介绍,在随后的几章中我们只使用double类型,上一节介绍的常量3.14应该看作double类型的常量,printf的%f也应该看作double型的转换说明。
c语言表达式前言本文主要介绍什么是表达式,表达式在C语言中非常常见希望大家可以好好学习。
一、表达式定义表达式是一种有值的语法结构,它由运算符(变量、常量、函数调用返回值)结合而成,每个表达式一定有一个值。
二、常量表达式例子:a, 12, 12.4值:就是变量或者常量本身的值作为条件的时候非0即真,0即假三、算数表达式例子a+b c*d+a 12/3+d i++ --a值就是计算的结果作为条件的时候非0即真,0即假四、赋值表达式例子a=12 a+=12 a = c= d值赋值完a的值,即为结果作为条件的时候非0即真,0即假五、关系表达式例子a >b 2 ==3值:1和0(当表达式成立时返回一个1,表达式不成立时返回一个0)作为条件的时候非0即真,0即假六、逻辑表达式例子a && b(a与b)c||d(c或b)!a(非a)//具体后面文章讲解值:1和0(当表达式成立时返回一个1,表达式不成立时返回一个0)作为条件的时候非0即真,0即假七、复合表达式实质上就是一些算数运算结合在一起。
例子x = ( y = (a + b + a > 4), z=10) //就是平时的复合运算值:依据运算符优先级和结合性得到结果作为条件非0即真,0即假八、逗号表达式例子(1,2,3,4,a) //值为最右侧的也就是a值:最右侧的值是逗号表达式的结果作为条件的时候非0即真,0即假代码:#include<stdio.h>int main(void){int a=1,2,3,4;printf("%d\n",a);//结果是4return 0;}九、其他的有返回值的函数也是一个表达式(函数后面文章讲解)其他运算符总结表达式类型多种多样,希望大家好好理解。
C语言详解表达式和语句C语言是一种广泛应用于系统开发和嵌入式设备编程的编程语言。
在理解和掌握C语言的基础知识中,对于表达式和语句的深入了解是至关重要的。
本文将详细讨论C语言中表达式和语句的概念、特性以及使用方法,帮助读者全面掌握这两个重要的概念。
一、表达式的概念与特性表达式是C语言中的一个基本概念,其由操作数和运算符组成。
操作数可以是常量、变量以及其他表达式,运算符用于对操作数进行运算操作。
在C语言中,表达式可以分为以下几种类型:1. 算术表达式:由数字常量、变量以及算术运算符(如+、-、*、/)组成。
例如,表达式a + b就是一个简单的算术表达式。
2. 关系表达式:用于比较相等或不相等的两个值,结果为真(非零)或假(零)。
关系表达式使用关系运算符(如==、!=、<、>、<=、>=)。
例如,表达式a > b就是一个关系表达式。
3. 逻辑表达式:用于逻辑判断,其结果为真或假。
逻辑表达式由逻辑运算符(如&&、||、!)连接。
例如,表达式a && b就是一个逻辑表达式。
4. 条件表达式:又称三元运算符,由三部分组成,用于在满足条件时返回一个值,否则返回另一个值。
条件表达式的形式为 condition ? expr1 : expr2。
例如,表达式(a > b) ? a : b就是一个条件表达式。
表达式在C语言中的使用非常广泛,可以用于求值、赋值、函数调用等多种场景。
在编写C语言程序时,我们需要熟练掌握不同类型表达式的语法和使用方法,以便能够正确和高效地使用它们。
二、语句的概念与分类语句是C语言中的另一个重要概念,其被用于组织和控制程序的执行流程。
C语言提供了多种类型的语句,我们现在来依次介绍其中一些常见的语句类型。
1. 赋值语句:用于给变量赋予新的值,其语法形式为variable = expression。
例如,a = 10就是一个赋值语句。
第 2 章常量、变量和表达式
5. 表达式
常量和变量都可以参与加减乘除运算,例如1+1、hour-1、hour * 60 + minute、minute/60等。
这里的+ - * /称为运算符(Operator),而参与运算的常量和变量称为操作数(Operand),上面四个由运算符和操作数所组成的算式称为表达式(Expression)。
和数学上规定的一样,hour * 60 + minute这个表达式应该先算乘再算加,也就是说运算符是有优先级(Precedence)的,*和/是同一优先级,+和-是同一优先级,*和/的优先级高于+和-。
对于同一优先级的运算从左到右计算,如果不希望按默认的优先级计算则要加()括号(Parenthesis)。
例如(3+4)*5/6应先算3+4,再算*5,再算/6。
前面讲过打印语句和赋值语句,现在我们定义:在任意表达式后面加个;号也是一种语句,称为表达式语句。
例如:
hour * 60 + minute;
这是个合法的语句,但这个语句在程序中起不到任何作用,把hour的值和minute 的值取出来加乘,得到的计算结果却没有保存,白算了一通。
再比如:
int total_minute;
total_minute = hour * 60 + minute;
这个语句就很有意义,把计算结果保存在另一个变量total_minute里。
事实上等号也是一种运算符,称为赋值运算符,赋值语句就是一种表达式语句,等号的优先级比+和*都低,所以先算出等号右边的结果然后才做赋值操作,整个表达式total_minute = hour * 60 + minute加个;号构成一个语句。
任何表达式都有值和类型两个基本属性。
hour * 60 + minute的值是由三个int 型的操作数计算出来的,所以这个表达式的类型也是int型。
同理,表达式total_minute = hour * 60 + minute的类型也是int,它的值是多少呢?C语言规定等号运算符的计算结果就是等号左边被赋予的那个值,所以这个表达式的值和hour * 60 + minute的值相同,也和total_minute的值相同。
等号运算符还有一个和+ - * /不同的特性,如果一个表达式中出现多个等号,不是从左到右计算而是从右到左计算,例如:
int total_minute, total;
total = total_minute = hour * 60 + minute;
计算顺序是先算hour * 60 + minute得到一个结果,然后算右边的等号,就是把hour * 60 + minute的结果赋给变量total_minute,这个结果同时也是整个表达式total_minute = hour * 60 + minute的值,再算左边的等号,即把这个值再赋给变量total。
同样优先级的运算符是从左到右计算还是从右到左计算称为运算符的结合性(Associativity)。
+ - * /是左结合的,等号是右结合的。
现在我们总结一下到目前为止学过的语法规则:
表达式→标识符
表达式→常量
表达式→字符串字面值
表达式→ (表达式)
表达式→表达式 + 表达式
表达式→表达式 - 表达式
表达式→表达式 * 表达式
表达式→表达式 / 表达式
表达式→表达式 = 表达式
语句→表达式;
语句→ printf(表达式, 表达式, 表达式, ...);
变量声明→类型标识符 = Initializer, 标识符 = Initializer, ...;
(= Initializer的部分可以不写)
注意,本书所列的语法规则都是简化过的,是不准确的,目的是为了便于初学者理解,比如上面所列的语法规则并没有描述运算符的优先级和结合性。
完整的C语法规则请参考[C99]的Annex A。
表达式可以是单个的常量或变量,也可以是根据以上规则组合而成的更复杂的表达式。
以前我们用printf打印常量或变量的值,现在可以用printf打印更复杂的表达式的值,例如:
printf("%d:%d is %d minutes after 00:00\n",
hour, minute, hour * 60 + minute);
编译器在翻译这条语句时,首先根据上述语法规则把这个语句解析成下图所示的语法树,然后再根据语法树生成相应的指令。
语法树的末端的是一个个Token,每一步展开利用一条语法规则。
图 2.2. 语法树
根据这些语法规则进一步组合可以写出更复杂的语句,比如在一条语句中完成计算、赋值和打印功能:
printf("%d:%d is %d minutes after 00:00\n",
hour, minute, total_minute = hour * 60 +
minute);
理解组合(Composition)规则是理解语法规则的关键所在,正因为可以根据语法规则任意组合,我们才可以用简单的常量、变量、表达式、语句搭建出任意复杂的程序,以后我们学习新的语法规则时会进一步体会到这一点。
从上面的例子可以看出,表达式不宜过度组合,否则会给阅读和调试带来困难。
根据语法规则组合出来的表达式在语义上并不总是正确的,例如:
minute + 1 = hour;
等号左边的表达式要求表示一个存储位置而不是一个值,这是等号运算符和+ - * /运算符的又一个显著不同。
有的表达式既可以表示一个存储位置也可以表示一个值,而有的表达式只能表示值,不能表示存储位置,例如minute + 1这个表达式就不能表示存储位置,放在等号左边是语义错误。
表达式所表示的存储位置称为左值(lvalue)(允许放在等号左边),而以前我们所说的表达式的值也称为右值(rvalue)(只能放在等号右边)。
上面的话换一种说法就是:有的表达式既可以做左值也可以做右值,而有的表达式只能做右值。
目前我们学过的表达式中只有变量可以做左值,可以做左值的表达式还有几种,以后会讲到。
我们看一个有意思的例子,如果定义三个变量int a, b, c;,表达式a = b = c 是合法的,先求b = c的值,再把这个值赋给a,而表达式(a = b) = c是不合法的,先求(a = b)的值没问题,但(a = b)这个表达式不能再做左值了,因此放在= c的等号左边是错的。
关于整数除法运算有一点特殊之处:
hour = 11;
minute = 59;
printf("%d and %d hours\n", hour, minute /
60);
执行结果是11 and 0 hours,也就是说59/60得0,这是因为两个int型操作数相除的表达式仍为int型,只能保存计算结果的整数部分,即使小数部分是0.98也要舍去。
向下取整的运算称为Floor,用数学符号⌊⌋表示;向上取整的运算称为Ceiling,用数学符号⌈⌉表示。
例如:
⌊59/60⌋=0
⌈59/60⌉=1
⌊-59/60⌋=-1
⌈-59/60⌉=0
在C语言中整数除法取的既不是Floor也不是Ceiling,无论操作数是正是负总是把小数部分截掉,在数轴上向零的方向取整(Truncate toward Zero),或者说当操作数为正的时候相当于Floor,当操作符为负的时候相当于Ceiling。
回到先前的例子,要得到更精确的结果可以这样:
printf("%d hours and %d percent of an
hour\n", hour, minute * 100 / 60);
printf("%d and %f hours\n", hour, minute /
60.0);
在第二个printf中,表达式是minute / 60.0,60.0是double型的,/运算符要求左右两边的操作数类型一致,而现在并不一致。
C语言规定了一套隐式类型转换规则,在这里编译器自动把左边的minute也转成double型来计算,整个表达式的值也是double型的,在格式化字符串中应该用%f转换说明与之对应。
本来编程语言作为一种形式语言要求有简单而严格的规则,自动类型转换规则不仅很复杂,而且使C语言的形式看起来也不那么严格了,C语言这么设计是为了书写程序简便而做的折衷,有些事情编译器可以自动做好,程序员就不必每次都写一堆繁琐的转换代码。
然而C语言的类型转换规则非常难掌握,本书的前几章会尽量避免类型转换,到第 3 节“类型转换”再集中解决这个问题。
习题
1、假设变量x和n是两个正整数,我们知道x/n这个表达式的结果要取Floor,例如x是17,n是4,则结果是4。
如果希望结果取Ceiling应该怎么写表达式呢?例如x是17,n是4,则结果是5;x是16,n是4,则结果是4。