C语言二元函数赋值 c语言二元运算符( 二 )


while (c=getc(in) != EOF)加个括号
putc(c,out);
“while”语句中要实现的功能是给变量c赋值,然后与EOF进行比较来终止循环,不幸的是,赋值操作的优先级低于比较操作的优先级,因此c的值是getc(in)与EOF比较的结果 , getc(in)的值将被弃掉 , 因此拷贝生成的文件将是一连串的1 。
想实现以上的功能并不困难,可以简单修改如下:
while ((c=getc(in)) != EOF)
putc(c,out);
然而 , 在复杂语句中,这种优先级混淆的问题是很难被发现的 。在UNIX系统下面的几个不同版本的连接程序中曾经出现过如下的错误语句:赋值在别的地方,为什么在这个地方赋
if( (t=BTYPE(pt1-aty)==STRTY) || t==UNIONTY ){
此条语句要实现的功能是给变量t赋值,然后判断是否与STRTY相等或者与UNIONTY相等 , 但是这条语句真正实现的功能并不是这样 。
C语言中,逻辑运算符的优先级分配有其历史的原因 。B语言,也就是C语言的前身,也有相当于C语言中的和 | 操作符 , 尽管它们被定义用作位运算符,但是当用于条件上下文时,编译器会自动将它们当作和 || 运算 。
C++/C语言的运算符有数十个 , 运算符的优先级与结合律如表所示 。注意一元运算符+ - *的优先级高于对应的二元运算符 。
下表中包括了C++所有的操作符,共有16级优先级 。表中的操作符如果重复出现,则第1次出现的是单目运算符 , 第二次出现的的双目运算符 。
优先级
运算符
结合律(从高到低排列)
1
 () [] - :: .
左→右
2
 ! ~ + - ++ --* (强制转换类型) sizeof new delete
右→左
3
 .* - *
左→右
4
 * / %
左→右
5
 + -
左→右
6
左→右
7
= =
左→右
8
 == !=
左→右
9
左→右
10
 ^
左→右
11
 |
左→右
12
左→右
13
 ||
左→右
14
 ?:
右→左
15
 = *= /= += -= |= = = %= = ^= = ||=
右→左
17
 '
左→右
用C语言编写解二元一次方程的程序?假设的情况:
输入没有错误;
x 总是在前面,y 总是在后面;
不存在某个变量系数为 0 的情况(即总是二元方程);
不考虑小数 , 其实考虑小数也简单,你可以自己思考如何实现 。
首先,使用 scanf() 将回车之前的整个字符串扫描进来,放进 str 变量中;
之后,分别以 x y = 为界,找到它们分隔的三个字符串,即从 str 的第一位开始循环,当遇到 'x' 时,停止并将之前的所有字符存到 x 的系数字符串 xStr 中 , 再从 x 之后开始寻找,遇到 'y' 时将找到的 'x' 与 'y' 之间的字符存到 y 的系数字符串 yStr 中,再向后从 '=' 开始直到结束,存为结果字符串 sumStr 。
这样,我们得到的三个字符串都具有相同的格式,一定可以通过某种方式将其转换为一个数字,使用同一个函数就可以做到 。
对于某个字符串来说,它可能是以负号 '-' 开头,也可能以正号开头 '+',也可能没有符号,也可能为空,分别考虑:以负号开头的,将其作为负数,以正号开头或没有符号的,将其作为正数;为空的字符串将其视为 1 。
截取符号之后,如果没有剩余字符了,将其视为 1,再与符号相乘,就是最终结果 。
如果还有剩余,那么之后的字符都是纯数字了(不考虑小数) , 从字符串的最后一位往前开始循环,下标记为 i(从0开始一直到最前面的数字位数),每一位字符记为 ch,则 n=(int)(ch-'0') 就是当前字符所代表的数字,用 n*pow(10, i) 就得到了当前数字的实际值,把所有的乘积都加起来,就得到了总的系数的绝对值,再乘以符号 , 就得到了系数值 。

推荐阅读