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