C:声明将是什么';返回一个| 1';当A>;1.

C:声明将是什么';返回一个| 1';当A>;1.,c,objective-c,C,Objective C,虽然我自己不会写,但是如果A(保证为零或正整数)大于1,下面的语句的预期结果是什么 返回A | | 1; 在许多语言中,我希望返回A,除非A的值为零,在这种情况下1为零 我手头没有C语言书,但我注意到,实际上,值1似乎总是返回的。这是编译器优化的结果还是考虑到表达式的潜在模糊性,返回值是否不确定?预期结果为是(或真) |运算符如果至少有一个操作数为真(代码中的第二个操作数显然为真),则返回真值。这是直C(不涉及Objective-C)。它将始终返回1。标准说明 如果|运算符的任一操作数比较不

虽然我自己不会写,但是如果
A
(保证为零或正整数)大于1,下面的语句的预期结果是什么


返回A | | 1;

在许多语言中,我希望返回
A
,除非
A
的值为零,在这种情况下1为零


我手头没有C语言书,但我注意到,实际上,值1似乎总是返回的。这是编译器优化的结果还是考虑到表达式的潜在模糊性,返回值是否不确定?

预期结果为是(或真)

|
运算符如果至少有一个操作数为真(代码中的第二个操作数显然为真),则返回真值。

这是直C(不涉及Objective-C)。它将始终返回1。

标准说明

如果
|
运算符的任一操作数比较不等于0,则该运算符应产生1;否则,结果为0。结果的类型为int


参见C中的

第6.5.14节,
|
和&
的结果
始终为
0
1
,而不考虑操作数的值,任何其他非零值。这意味着您的
A | | 1
将始终产生1。

对于基于C的语言,任何非零值都是真的(由1表示)。如果你的A为零,它会检查其他的比较,如果是OR比较


在您的示例中,无论A的值是什么,都将始终返回1,即使您使用的是| | 2。如果2为非零,当使用逻辑运算符OR执行时,将始终返回true(由1表示)

我相信编译器将进行优化,甚至不会检查A的值。有人能确认吗?我的印象是,对于A&&0、A | | 1和A | | 0(=A&&1),编译器通过认识到表达式可以分别简化为0、1或A来节省时间。

它是否不返回“YES”,如果尝试将其作为int获取,则会将其转换为1?我对目标C一无所知,我只是在猜测。(一个快速的谷歌告诉我“是”是客观C的“真”。)不完全是YES只是一个给出
1
的宏。因此,它只返回
1
。没有涉及到转换到
bool
(或
bool
\u bool
或任何内容)。也许您正在考虑
返回一个?A:1这正是我把它改成的。啊!当然我想今天下午所有的雨都把我的脑子搞糊涂了。在我修复了bug之后,我试着把它解释给其他人,因为它对数字的价值太过关注了。这个答案与<代码> > <代码> >代码>是> < /代码>无关,但只与表达式的结果有关。在这种情况下,总是1。@罗杰:注意,如果你想要替代效果的话。描述,您可以通过
返回A?A:1