C 如何减少表达

C 如何减少表达,c,syntax,ternary-operator,conditional-operator,C,Syntax,Ternary Operator,Conditional Operator,如何减少表达?如果我是对的,如果x=0,那么x赋值为0;否则x指定1。但是,它怎么能缩短呢 x = (x = 0) ? 0 : 1 假设您的意思是x==0,那么这相当简短: x = !!x; 说明: 如果x为0,!x是1,所以!!x为0 如果x不是0,!x是0,所以!!x是1 如果x=0是故意的,则代码未定义 但你可以制作一个简短的版本,它定义明确,我相信它能抓住作者的意图: x = 1; 由于x=0的值是0,如果它正是您发布的值,则它是未定义的行为 表情 x = (x = 0);

如何减少表达?如果我是对的,如果x=0,那么x赋值为0;否则x指定1。但是,它怎么能缩短呢

 x = (x = 0) ? 0 : 1

假设您的意思是
x==0
,那么这相当简短:

x = !!x;
说明:

如果
x
0
!x
1
,所以
!!x
0

如果
x
不是
0
!x
0
,所以
!!x
1

如果
x=0
是故意的,则代码未定义

但你可以制作一个简短的版本,它定义明确,我相信它能抓住作者的意图:

 x = 1;

由于
x=0
的值是
0

,如果它正是您发布的值,则它是未定义的行为

表情

x = (x = 0);
未定义,因为
x=0
在将其分配给
x
之前修改了
x
,所以说这两个子表达式之间没有序列点。你可以在这里读到

相当于

x = x++;
x = 1;
许多程序员会立即将其识别为未定义的行为,尽管在
x=(x=0)
中很难看到它,但这是同一个问题,
x=0
会产生副作用,因此在这种情况下,行为没有定义。

抛开所有假设部分,首先让我明确说明这一点,这里没有未定义的行为

引用第§6.5.15章“条件运算符”(强调矿山)中的
C11

计算第一个操作数;在其评估和测试之间有一个序列点 计算第二个或第三个操作数(以计算值为准)。第二个操作数 仅当第一个比较值不等于0时才计算;第三个操作数仅当 第一个值等于0;结果是第二个或第三个操作数的值 (以评估者为准),[……]

然后,将结果分配给外部赋值运算符的LHS

声明说,

x = (x = 0) ? 0 : 1;
相当于

x = x++;
x = 1;
as
x=0
最终无条件地计算为FALSE

相关,引用标准,第§6.5.16章,分配操作员(重点)

赋值运算符将值存储在由左操作数指定的对象中An 赋值表达式具有赋值后左操作数的值,


注:

也就是说,与问题中提到的理解有关

如果只有x=0,则x指定0;否则x指定1


这是错误的。给定语句中没有if..else..then类别条件检查。

最有趣的是x=0,只有一个等于signYep!我看到你的答案了,请解释一下
x=0
的计算结果为false,因此
旁边的值被分配给
x
@molbdnilo
如果x=0是故意的,则代码是未定义的。
您介意详细说明吗?这是我的一个hometasksjust
x=1…@usr该文本是OP的假设,而不是需求,IMHO.Ummm。。我不确定我是否遗漏了什么,但为什么它是UB?更具体地说,在第一个和第二个/第三个操作数之间有一个Seq点,对吗?@iharob我仍然不明白这个情况,有一个序列点,对吧?试着在GCC下编译时发出警告,它会说
警告:“x”上的操作可能未定义[-wsSequence point]
。@iharob,那很有趣。我想得到更多的信息。我到底在哪里读错了标准?(我希望你不介意重新措辞评论,对吗?@molbdnilo先生,我不太确定我是否在关注你,我仍然不知道最终任务是如何导致问题的。如我们所见,首先计算条件的第一个操作数(
x
赋值),然后是一个序列点,然后计算第三个操作数,然后得到结果,结果再次赋值给同一个变量
x
。那么,中间序列点在这里是如何不重要的呢?如果我遗漏了什么,请纠正我。