C中的条件运算符一元
有人能给我解释一下,或者告诉我如何解决条件运算符的编码问题吗 它似乎总是跳过条件运算符,只打印第二个选项,即使我将服务器更改为0或1 它总是打印出第二个选项SetB然后SetA 为什么这不起作用?这是某种语义错误吗?还是逻辑错误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
#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]
您只需使用正确的语法即可完成所需操作。