赋值
赋值是表达式的一种,而不是某种类型的语句,所以只要是允许表达式出现的地方,都可以赋值。
赋值操作符把右边的操作数的值存储在右边的操作数的指定位置。但赋值也是个表达式,表达式就具有一个值。赋值表达式的值就是左边操作数的新值,它可以作为其他赋值操作符的操作数,如下面的例子:a=x=y+3;赋值操作符的结合性(求值顺序)是从右到左,所以这个表达式相当于:a=(x(=y+3));他的意思分开来写就是x=y+3;a=x;
警告:
在a=x=y+3中认为a和x 被赋予了相同的值的说法是不正确的。
如果x是一个字符型变量,那么y+3的值就会被截取一段,一边容纳与字符类型的变量中,那么a所赋的值就是这个被截短之后的值。在下面这个常见的错误中,这种截断正是问题的根源所在。
char ch;
while((ch=getchar())!=EOF)...
EOF需要的位数比字符类型值所能提供的位数要多,这也是getchar返回的一个整型值,而不是字符值的原因。然而,把getchar的返回值首先存储与ch中将导致它被截断。然后这个被截短的值被提升为整型并与EOF进行比较。这个存在错误的代码在使用有符号字符集的机器中运行时,如果去了一个值为\377的字节时,循环就会终止,因为这个值截短再提升之后与EOF相等。当者段代码再使用无符号字符集的机器上面运行时,这个循环将会永远也不会停止。
赋值是表达式的一种,而不是某种类型的语句,所以只要是允许表达式出现的地方,都可以赋值。
赋值操作符把右边的操作数的值存储在右边的操作数的指定位置。但赋值也是个表达式,表达式就具有一个值。赋值表达式的值就是左边操作数的新值,它可以作为其他赋值操作符的操作数,如下面的例子:a=x=y+3;赋值操作符的结合性(求值顺序)是从右到左,所以这个表达式相当于:a=(x(=y+3));他的意思分开来写就是x=y+3;a=x;
警告:
在a=x=y+3中认为a和x 被赋予了相同的值的说法是不正确的。
如果x是一个字符型变量,那么y+3的值就会被截取一段,一边容纳与字符类型的变量中,那么a所赋的值就是这个被截短之后的值。在下面这个常见的错误中,这种截断正是问题的根源所在。
char ch;
while((ch=getchar())!=EOF)...
EOF需要的位数比字符类型值所能提供的位数要多,这也是getchar返回的一个整型值,而不是字符值的原因。然而,把getchar的返回值首先存储与ch中将导致它被截断。然后这个被截短的值被提升为整型并与EOF进行比较。这个存在错误的代码在使用有符号字符集的机器中运行时,如果去了一个值为\377的字节时,循环就会终止,因为这个值截短再提升之后与EOF相等。当者段代码再使用无符号字符集的机器上面运行时,这个循环将会永远也不会停止。



