大学计算机程序设计基础(C语言5)ppt112
程序设计基础(国家级精品课) 张长海 程序设计基础(国家级精品课) 第十三章 若干深入问题 第十三章 若干深入问题 函数 函数指针 函数作参数 间接递归 函数副作用 运算 赋值 顺序表达式 条件表达式 位运算 §13.1.3 计算算术表达式的值—间接递归 前边讲的递归程序,都是在函数本身的函数体内调用自己。 而递归的动态含义是在调用函数进入函数后,没有退出之前,又再一次调用本函数。 可能存在如图所示情况,这显然也是进入P后,没退出P之前又再一次调用P ,这种情况称“间接递归”。 相应前边讲的“在P中直接调用P”称“直接递归”。 【例13.5】编程序,从终端读入表达式,计算表达式的值。表达式遵守先乘除后加减的运算规则,并且允许有括号。它的构成规则是: 表达式是“加法项”;或者“由一个加法项加上一个表达式”构成;或者“由一个加法项减去一个表达式”构成。 加法项是“乘法因子”;或者“由一个乘法因子乘以一个加法项”构成;或者“由一个乘法因子除以一个加法项”构成。 乘法因子是一个“数字”;或者是 “由一对括号括起来的表达式”构成。 若用E、T、F分别表示表达式、加法项、乘法因子,则可以形式化的表示表达式的构成如下: E : T+E 或者 T-E 或者 T T : F*T 或者 F/T 或者 F F : 数字 或者 (E) §13.2 运算 C语言的运算符非常丰富,第三章表3.1列出了所有C运算符,包括运算符的记号、运算、类别、优先级、结合关系等。常用的运算符及其意义我们已经在前面相关章节介绍过,本节介绍那些C独有的特色。 13.2.1 赋值运算 “=”可以和一些双目运算符结合,形成新的附加运算意义的赋值运算符,称为复合赋值运算符。 复合赋值运算符包括: += -= *= /= %= <<= >>= &= ^= |= 使用这些赋值运算符的格式是: 操作数1 赋值运算符 操作数2 复合赋值运算 a op= b 与简单赋值运算 a = a op b 等价。 13.2.2 顺序表达式 用逗号运算符 , 分隔开的若干个表达式称为逗号表达式,又称为顺序表达式。逗号表达式按行文顺序从左向右计算各个子表达式的值。 表达式的结果类型是最右端表达式的类型, 表达式的结果值是最右端表达式的值。 例如 : j = ( x=0.5 , y=10 ,15+x ,y=(int)x+y*2 ) 将顺序的: 先计算 “x=0.5” 给 x 赋值 0.5 ,得 float 类型的 0.5; 再计算 “y=10” 给 y 赋值 10 ,得 int 类型的 10 ; 再计算 “15+x” ,得 float 类型的 15.5 ; 再计算 “y=(int)x+y*2” 给 y 赋值 20 ,得 int 类型的 20 ; 最终括号内表达式的结果值是 20 ,结果类型是整数类型,j 被赋值 20 。 13.2.3 条件表达式 C条件表达式格式是: 操作数1 ? 操作数2 : 操作数3 该表达式含有两个运算符 “ ?” 和 “ :” 、三个操作数。条件表达式是三元表达式,运算符 “ ?” 和 “ :” 合并使用称为三元运算符。 条件表达式的计算步骤是: 1. 计算“操作数1 ”; 2. 若“操作数1”的值为true,则计算“操作数2” ,表达式的值为“操作数2”的值; 3. 否则“操作数1”的值为false ,计算“操作数3” ,表达式的值为“操作数3”的值。 条件表达式是右结合的,优先级别高于赋值运算符,低于二元操作符。 表达式语句 x = a ? b : c ; 相当于如下条件语句: if ( a != 0 ) x = b; else