《C语言程序设计现代方法》第4章 表达式
C语言的一个特点就是它更多地强调表达式而不是语句,表达式是表示如何计算值的公式。
当表达式包含两个或更多个相同优先级的运算符时,运算符的结合性(associativity)开始发挥作用。如果运算符是从左向右结合的,称这种运算符是左结合的(left associative);如果运算符是从右向左结合的,那么称这种运算符是右结合的(right associative)。
程序:计算通用产品代码的校验位
美国和加拿大的货物生产商都会在超市销售的每件商品上放置一个条形码,称为通用产品代码(Universal Product Code,UPC),用于设别生产商和产品。该代码由四组数字组成,比如:
0 13800 15173 5
第一组数字共1位,用于表示商品的种类;第二组数字占用5位,用来标识生产商;第三组数字占用5位,用来标识产品(包括包装和尺寸);最后1位数字是“校验位”,它唯一的目的就是用来识别前面的数字是否出错。
下面是计算校验位的一种方法:首先把第1、3、5、7、9、11位数字相加,设和为sum1;接着将第2、4、6、8、10位数字相加,设和为sum2;接着把第一次加法的结果乘以3,再和第二次加法的结果相加;随后再把上述结果减1;相减后的结果除以10取余数;最后用9减去上一步骤中得到的余数。
1 /* upc.c */ 2 /* Computes a Universal Product Code check digit */ 3 int main() 4 { 5 int d, i1, i2, i3, i4, i5, j1, j2, j3, j4, j5; 6 int first_sum, second_sum, total; 7 8 printf("Enter the first (single) digit: "); 9 scanf("%1d", &d); 10 printf("Enter the first group of five digits: "); 11 scanf("%1d%1d%1d%1d%1d", &i1, &i2, &i3, &i4, &i5); 12 printf("Enter the seconf group of five digits: "); 13 scanf("%1d%1d%1d%1d%1d", &j1, &j2, &j3, &j4, &j5); 14 15 first_sum = d + i2 + i4 + j1 + j3 + j5; 16 second_sum = i1 + i3 + i5 + j2 + j4; 17 total = first_sum * 3 + second_sum; 18 printf("Check digit: %d\n", 9 - ((total - 1) % 10)); 19 20 return 0; 21 }
运行结果如下:
在许多编程语言中,赋值是语句;然而,在C语言中赋值就像+那样是运算符。换句话说,赋值操作产生结果,就如同两个数相加产生结果一样。
大多数C语言运算符允许它们的操作数是变量、常量或者包含其他运算符的表达式,然而,赋值运算符要求它的左操作数必须是左值(lvalue)。左值表示存储在计算机内存中的对象,而不是常量或计算的结果。
小结:所有的11种赋值运算符,包括简单赋值和复合赋值,其优先级(优先级仅仅高于逗号运算符)和结合性(均右结合性)都相同。
C语言有一条不同寻常的规则,那就是任何表达式都可以用作语句(表达式语句)。