有人能向我解释或告诉我如何解决条件运算符的编码问题吗
它似乎总是跳过条件运算符,只打印出第二个选项,即使我将服务器更改为0或1
并且它总是打印出第二个选项SetB然后是SetA
为什么这不起作用?这是某种语义错误吗?还是逻辑错误?
#include <stdio.h>
#include <limits.h>
int main(int argc, char *argv[]){
int ch = -191;
int x = UINT_MAX;
int setA[5]={-1,-1,-1,-1,-1};
int setB[5]={-2,-2,-2,-2,-2};
int server = 1;
int i=2;
printf("%d %dn",server==1?setA[i],setB[i]:setB[i],setA[i]);
printf("%d %dn",server==0?setA[i],setB[i]:setB[i],setA[i]);
// printf("%un%un",ch,x);
}
三元运算符的语法是:条件表达式:表达式
在代码中,第一个表达式是setA[i], setB[i]
,第二个表达式是setB[i]
。由于语言语法的工作方式,最后一个逗号是参数分隔符(而不是第二个表达式的一部分),因此您的代码等效于:
int a = (server == 1) ? setB[i] : setB[i];
printf("%d %dn", a, setA[i]);
这当然与相同
printf("%d %dn", setB[i], setA[i]);
所以不管条件如何,你总是得到相同的结果。
如果在一个代码块中有许多类似的行,一个可能的解决方案是基于当前服务器设置一些设置别名:
// do this once:
int *set0, *set1;
if ( server == 1 )
set0 = setA, set1 = setB;
else
set0 = setB, set1 = setA;
// then use it like this
printf("%d %dn", set0[i], set1[i]);
server==1?setA[i],setB[i]:setB[i],setA[i]
请注意条件运算符之间的逗号运算符,此表达式的结果不会如您所期望的那样。
相反,我建议使用if
语句。它更清晰,不易出错。
if (server == 1)
{
printf("%d %dn", setA[i], setB[i]);
}
else
{
printf("%d %dn", setB[i], setA[i]);
}
表达式
server==1?setA[i],setB[i]:setB[i],setA[i]
相当于:
(server==1? (setA[i],setB[i]) : setB[i]), setA[i])
相当于
(server==1? setB[i] : setB[i]), setA[i]
相当于
setB[i], setA[i]
但是,这不是你想要的。你想要的是:
if ( server == 1 )
{
printf("%d %dn", setA[i], setB[i]);
}
else if ( server == 0 )
{
printf("%d %dn", setB[i], setA[i]);
}
您应该使用这样的三元运算符:
server == 1 ? printf("%d %d", setA[i], setB[i]):printf("%d %d", setB[i], setA[i]);
第二句话也是如此。
你使用它的方式:
如果server == 1
则setA[i], setB[i]
计算为setB[i]
,因为这是C中逗号,
运算符的属性,并且只执行最后一条语句。
即
如果server == 1
然后
printf("%d %dn",server==1?setA[i],setB[i]:setB[i],setA[i]);
将被评估为(由于?:
运算符优先于,
运算符)
printf("%d %dn",(server==1?(setA[i],setB[i]):setB[i]),setA[i]);
哪个是
printf("%d %dn",setB[i], setA[i]);
以及类似的
printf("%d %dn",server==0?setA[i],setB[i]:setB[i],setA[i]);
将被简单地评估为
printf("%d %dn",(server==0?(setA[i],setB[i]):setB[i]),setA[i])
又是
printf("%d %dn",setB[i],setA[i]);
您可以对server == 0
进行类似的解析,得到相同的结果。