C中三元运算符的逻辑与

C中三元运算符的逻辑与,c,ternary-operator,logical-operators,logical-and,C,Ternary Operator,Logical Operators,Logical And,我试图在C中找到3个整数(var1,var2,var3)的最大值和最小值。为了让事情稍微有趣一点,我将逻辑写在一行中 (var1>var2)?((var1>var3)?(max=var1):(max=var3)&&(min=var2)):((var2>var3)?(max=var2):(max=var3)&&(min=var1)); 为了使调试更容易,这里有几行令人厌烦的版本 (var1>var2)? ((var1>var3

我试图在C中找到3个整数(var1,var2,var3)的最大值和最小值。为了让事情稍微有趣一点,我将逻辑写在一行中

(var1>var2)?((var1>var3)?(max=var1):(max=var3)&&(min=var2)):((var2>var3)?(max=var2):(max=var3)&&(min=var1));
为了使调试更容易,这里有几行令人厌烦的版本

(var1>var2)?
    ((var1>var3)?
        (max=var1):
        (max=var3)&&(min=var2)
    ):
    ((var2>var3)?
     (max=var2):
     (max=var3)&&(min=var1)
    );
未执行逻辑AND,min返回垃圾值。
帮助。

看看这个无聊的版本:

(var1>var2)?
    ((var1>var3)?
        (max=var1): // nothing gets assigned to min
        (max=var3)&&(min=var2) // nothing gets assigned to min, if var3==0
    ):
    ((var2>var3)?
     (max=var2): // nothing gets assigned to min
     (max=var3)&&(min=var1) // nothing gets assigned to min, if var3==0
    );

你可以看到,在很多情况下,没有任何东西被分配到
min

来让事情变得复杂,你只是在一行上写。帮助自己的第一步是将一行拆分为几行,以简化分析。我的测试部分有效。如果您使用sentinel值初始化
min
max
,则可能更容易跟踪问题,而不是获取“垃圾”。在枯燥的版本中,您可以非常清楚地看到,如果max为0,则不会发生最小赋值。这是否适合失败的测试用例?否则,有些情况下,例如var1为max,其中根本没有为min分配任何代码。