C中的条件运算符一元

C中的条件运算符一元,c,C,有人能给我解释一下,或者告诉我如何解决条件运算符的编码问题吗 它似乎总是跳过条件运算符,只打印第二个选项,即使我将服务器更改为0或1 它总是打印出第二个选项SetB然后SetA 为什么这不起作用?这是某种语义错误吗?还是逻辑错误 #include <stdio.h> #include <limits.h> int main(int argc, char *argv[]){ int ch = -191; int x = UINT_MAX; int se

有人能给我解释一下,或者告诉我如何解决条件运算符的编码问题吗

它似乎总是跳过条件运算符,只打印第二个选项,即使我将服务器更改为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 %d\n",server==1?setA[i],setB[i]:setB[i],setA[i]);
   printf("%d %d\n",server==0?setA[i],setB[i]:setB[i],setA[i]);


  // printf("%u\n%u\n",ch,x);

}
#包括
#包括
int main(int argc,char*argv[]){
int ch=-191;
int x=UINT_最大值;
int setA[5]={-1,-1,-1,-1};
int-setB[5]={-2,-2,-2,-2};
int server=1;
int i=2;
printf(“%d%d\n”,server==1?setA[i],setB[i]:setB[i],setA[i]);
printf(“%d%d\n”,server==0?setA[i],setB[i]:setB[i],setA[i]);
//printf(“%u\n%u\n”,ch,x);
}

您应该像这样使用三元运算符:

server==1?printf(“%d%d”,setA[i],setB[i]):printf(“%d%d”,setB[i],setA[i])

第二句话也是如此

您使用它的方式:

如果
服务器==1

然后
setA[i],setB[i]
的计算结果为
setB[i]
,因为这是C中逗号
运算符的属性,并且只执行最后一条语句

i、 e

如果
服务器==1

然后

printf(“%d%d\n”,server==1?setA[i],setB[i]:setB[i],setA[i])

将被评估为(由于
?:
运算符的优先级高于
运算符)

printf(“%d%d\n”),(服务器==1?(setA[i],setB[i]):setB[i]),setA[i])

那是

printf(“%d%d\n”,setB[i],setA[i])

同样地

printf(“%d%d\n”,服务器==0?setA[i],setB[i]:setB[i],setA[i])

将被简单地评估为

printf(“%d%d\n”),(服务器==0?(setA[i],setB[i]):setB[i]),setA[i])

又是什么

printf(“%d%d\n”,setB[i],setA[i])


您可以对
server==0进行类似的分析,您将得到相同的结果。

您应该像这样使用三元运算符:

server==1?setA[i],setB[i]:setB[i],setA[i]
server==1?printf(“%d%d”,setA[i],setB[i]):printf(“%d%d”,setB[i],setA[i])

第二句话也是如此

您使用它的方式:

如果
服务器==1

然后
setA[i],setB[i]
的计算结果为
setB[i]
,因为这是C中逗号
运算符的属性,并且只执行最后一条语句

i、 e

如果
服务器==1

然后

printf(“%d%d\n”,server==1?setA[i],setB[i]:setB[i],setA[i])

将被评估为(由于
?:
运算符的优先级高于
运算符)

printf(“%d%d\n”),(服务器==1?(setA[i],setB[i]):setB[i]),setA[i])

那是

printf(“%d%d\n”,setB[i],setA[i])

同样地

printf(“%d%d\n”,服务器==0?setA[i],setB[i]:setB[i],setA[i])

将被简单地评估为

printf(“%d%d\n”),(服务器==0?(setA[i],setB[i]):setB[i]),setA[i])

又是什么

printf(“%d%d\n”,setB[i],setA[i])

您可以对
server==0进行类似的解析,您将得到相同的结果

server==1?setA[i],setB[i]:setB[i],setA[i]
请注意条件运算符之间的逗号运算符,此表达式的结果与预期不符

相反,我建议使用
if
语句。它更清晰,更不容易出错

if (server == 1)
{
    printf("%d %d\n", setA[i], setB[i]);
}
else
{
    printf("%d %d\n", setB[i], setA[i]);
}
请注意条件运算符之间的逗号运算符,此表达式的结果与预期不符

相反,我建议使用
if
语句。它更清晰,更不容易出错

if (server == 1)
{
    printf("%d %d\n", setA[i], setB[i]);
}
else
{
    printf("%d %d\n", setB[i], setA[i]);
}
表情

server==1?setA[i],setB[i]:setB[i],setA[i]
相当于:

(server==1? (setA[i],setB[i]) : setB[i]), setA[i])
int a = (server == 1) ? setB[i] : setB[i];
printf("%d %d\n", a, setA[i]);
这相当于

(server==1? setB[i] : setB[i]), setA[i]
setB[i], setA[i]
这相当于

(server==1? setB[i] : setB[i]), setA[i]
setB[i], setA[i]
但是,那不是你想要的。你想要的是:

if ( server == 1 )
{
  printf("%d %d\n", setA[i], setB[i]);
}
else if ( server == 0 )
{
  printf("%d %d\n", setB[i], setA[i]);
}
表情

server==1?setA[i],setB[i]:setB[i],setA[i]
相当于:

(server==1? (setA[i],setB[i]) : setB[i]), setA[i])
int a = (server == 1) ? setB[i] : setB[i];
printf("%d %d\n", a, setA[i]);
这相当于

(server==1? setB[i] : setB[i]), setA[i]
setB[i], setA[i]
这相当于

(server==1? setB[i] : setB[i]), setA[i]
setB[i], setA[i]
但是,那不是你想要的。你想要的是:

if ( server == 1 )
{
  printf("%d %d\n", setA[i], setB[i]);
}
else if ( server == 0 )
{
  printf("%d %d\n", setB[i], setA[i]);
}

三元运算符的语法是:条件?表达式:表达式

server==1?setA[i],setB[i]:setB[i],setA[i]
在您的代码中,第一个表达式是
setA[i],setB[i]
,第二个表达式是
setB[i]
。由于语言语法的工作方式,最后一个逗号是参数分隔符(不是第二个表达式的一部分),因此您的代码相当于:

(server==1? (setA[i],setB[i]) : setB[i]), setA[i])
int a = (server == 1) ? setB[i] : setB[i];
printf("%d %d\n", a, setA[i]);
当然,这与:

printf("%d %d\n", setB[i], setA[i]);
所以不管条件如何,你总是得到相同的结果


如果代码块中有许多类似的行,一种可能的解决方案是基于当前服务器设置一些set别名:

// 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 %d\n", set0[i], set1[i]);

三元运算符的语法是:条件?表达式:表达式

server==1?setA[i],setB[i]:setB[i],setA[i]
在您的代码中,第一个表达式是
setA[i],setB[i]
,第二个表达式是
setB[i]
。由于语言语法的工作方式,最后一个逗号是参数分隔符(不是第二个表达式的一部分),因此您的代码相当于:

(server==1? (setA[i],setB[i]) : setB[i]), setA[i])
int a = (server == 1) ? setB[i] : setB[i];
printf("%d %d\n", a, setA[i]);
当然,这与:

printf("%d %d\n", setB[i], setA[i]);
所以不管条件如何,你总是得到相同的结果


如果代码块中有许多类似的行,一种可能的解决方案是基于当前服务器设置一些set别名:

// 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 %d\n", set0[i], set1[i]);

int x=UINT\u MAX
是一个错误
int
最多只能保存
int\u MAX
以下的值
server==n?setA[i],setB[i]:setB[i]
意思是
server==n?setB[i]:setB[i]
您只需使用正确的语法即可完成所需操作。即,而不是:printf(“%d%d\n”,server==1?setA[I],setB[I]:setB[I],setA[I]);您可以执行以下操作:printf(“%d%d\n”),服务器=1?(setA[i],setB[i]):(setB[i],setA[i])<代码>int x=UINT_MAX
是一个错误
int
最多只能保存
int\u MAX
以下的值
server==n?setA[i],setB[i]:setB[i]
意思是
server==n?setB[i]:setB[i]
您只需使用正确的语法即可完成所需操作。