if((result = f())== 0)是未定义的行为?

时间:2016-01-02 19:42:17

标签: c undefined-behavior

  

5.17分配操作员

     

有几个赋值运算符,所有赋值运算符都从右到左分组。所有都需要一个可修改的左值作为左操作数,赋值表达式的类型是其左操作数的类型。赋值操作的结果是赋值发生后存储在左操作数中的值;结果是一个左值。

问题

  • if((result=f())==0),是 undefined-behavior

1 个答案:

答案 0 :(得分:3)

在C中,等于运算符==与两个赋值运算符不同。因此,在语句if((result=f())==0){...}中只有一个赋值运算符,因此C标准中用多个赋值运算符处理表达式的部分根本不相关。这个特殊的表达式是完美定义的(假设f()是)。

有点类似的表达式while((c = getchar()) != EOF){···}是一种相当常见的习惯用法,用于逐个字符地抓取键盘输入,直到遇到文件字符结尾。这样的习语允许你一石二鸟 - 为变量赋值,同时将该值与另一个值进行比较。