0如何在C语言的条件运算符中使用?
How is 0 used in conditional operator in C?
C中的条件运算符是这样使用的:
condition ? value_if_true : value_if_false
在 value_if_false
中使用 0 是什么意思?
例如,我见过一些人这样使用它。
a == b ? i++ : 0
好像什么都没做。这在其他函数中是否像 return 0
一样工作?
0
没有什么特别之处可以写
a == b ? i++ : 1
它的行为方式相同。
唯一的区别是当你将表达式赋给另一个变量时:
int c = a == b ? i++ : 1;
// a == b -> c will be i++
// a != b -> c will be 1
不过写起来更简洁
if (a == b) i++;
在 C 语言中,三元 是 if 语句的较短版本,它需要两个语句,if_true
和 if_false
。会是这样(其实一个case可以有多个语句,用逗号隔开):
短:
condition ? if_true : if_false;
长:
if (condition) {
if_true;
} else {
if_false;
}
如果你在 condition
前面放一些东西,你也可以赋值。
短:
result = condition ? if_true : if_false;
长:
if (condition) {
result = if_true;
} else {
result = if_false;
}
技巧来了。在 C 语言中,写 0;
是一个有效的语句,所以你的三进制变成了更长的版本,与下面的代码相同:
if (a == b) {
i++;
} else {
0; /* This is valid C statement */
}
或者如果你也有作业,那就是:
if (a == b) {
result = i++;
} else {
result = 0;
}
您也可以这样做:
int a;
/* Code here ... */
condition ? a = 5: 0;
实际上等同于:
if (condition) {
a = 5;
} else {
/* DO not touch a */
}
将三元运算符视为一种 shorthand 方式或编写 if-else 语句会有所帮助。
If(a == b){
i++;
}else{
//if assigned, return 0. Else do nothing.
}
有人可能想写 a == b ? i++ : 0;
的原因是 s/he 可能希望有一个(注意!您现在正在进入一个基于意见的领域)更容易和更快的替代 if (a == b) i++;
- 虽然这当然是基于意见的,但我个人并不同意相同的意见。
我认为 if
语句中的 "blocker" 是要求写括号 ()
,这可以通过使用条件运算符来省略。
"但是为什么 0
?"
C 语法需要条件运算符的第三个操作数。否则如果你想编译例如:
a == b ? i++;
编译器会报错:
"error: expected ':'
before ';'
token"
或者分别这样做:
a == b ? i++ : ;
会提高:
"error: expected expression before ';'
token"
所以他们使用 0
作为一种“语法满足”,以便能够使用条件运算符来替代 if
语句。您也可以在此处使用任何其他数值,但 0
是最易读的值,这表示它没有其他用途。
在示例中展示用法:
#include <stdio.h>
int main (void)
{
int a, b, c = 4;
a = 2;
b = 2;
a == b ? c++ : 0;
printf("%d",c);
return 0;
}
c
的输出将是 5
,因为 a == b
。
注意a == b ? i++ : 0
在使用f.e时是不一样的。在像 f.e.:
这样的作业中
int c = a == b ? i++ : 0;
这里 c
要么被 i
赋值,要么被 0
赋值,取决于 a == b
是否为真。如果 a == b
为真,则 c
由 i
赋值。如果a == b
错误,c
由0
赋值。
旁注:
从技术角度来看,?=
被称为“条件运算符”。 条件运算符是三元运算符.
中的一个
如果您想了解有关条件运算符 ?=
的更多信息,请查看 ISO:IEC 9899:2018 (C18),§6.5.15 -“条件运算符”了解更多信息。
?:
运算符是一个三元 运算符,但它不被称为"ternary",正如这里的某些答案and/or 评论所暗示的那样。它只是运算符的元数,就像 +
是 二元 运算符或 &
是一元运算符一样。如果它有名字的话,那就是 "Conditional Expression"-operator
它不完全等同于 if/else,因为它是第一个条件 value(结果是两个表达式必须具有相同的类型)地方,不是有条件的执行。当然,两种类型都可以强制转换,使它们相等。
对于 OP 所做的事情,我认为更好的选择(如果 if
不得使用):
a == b && i++;
这看起来更合乎逻辑。但当然这是风格问题。
C中的条件运算符是这样使用的:
condition ? value_if_true : value_if_false
在 value_if_false
中使用 0 是什么意思?
例如,我见过一些人这样使用它。
a == b ? i++ : 0
好像什么都没做。这在其他函数中是否像 return 0
一样工作?
0
没有什么特别之处可以写
a == b ? i++ : 1
它的行为方式相同。
唯一的区别是当你将表达式赋给另一个变量时:
int c = a == b ? i++ : 1;
// a == b -> c will be i++
// a != b -> c will be 1
不过写起来更简洁
if (a == b) i++;
在 C 语言中,三元 是 if 语句的较短版本,它需要两个语句,if_true
和 if_false
。会是这样(其实一个case可以有多个语句,用逗号隔开):
短:
condition ? if_true : if_false;
长:
if (condition) {
if_true;
} else {
if_false;
}
如果你在 condition
前面放一些东西,你也可以赋值。
短:
result = condition ? if_true : if_false;
长:
if (condition) {
result = if_true;
} else {
result = if_false;
}
技巧来了。在 C 语言中,写 0;
是一个有效的语句,所以你的三进制变成了更长的版本,与下面的代码相同:
if (a == b) {
i++;
} else {
0; /* This is valid C statement */
}
或者如果你也有作业,那就是:
if (a == b) {
result = i++;
} else {
result = 0;
}
您也可以这样做:
int a;
/* Code here ... */
condition ? a = 5: 0;
实际上等同于:
if (condition) {
a = 5;
} else {
/* DO not touch a */
}
将三元运算符视为一种 shorthand 方式或编写 if-else 语句会有所帮助。
If(a == b){
i++;
}else{
//if assigned, return 0. Else do nothing.
}
有人可能想写 a == b ? i++ : 0;
的原因是 s/he 可能希望有一个(注意!您现在正在进入一个基于意见的领域)更容易和更快的替代 if (a == b) i++;
- 虽然这当然是基于意见的,但我个人并不同意相同的意见。
我认为 if
语句中的 "blocker" 是要求写括号 ()
,这可以通过使用条件运算符来省略。
"但是为什么 0
?"
C 语法需要条件运算符的第三个操作数。否则如果你想编译例如:
a == b ? i++;
编译器会报错:
"error: expected
':'
before';'
token"
或者分别这样做:
a == b ? i++ : ;
会提高:
"error: expected expression before
';'
token"
所以他们使用 0
作为一种“语法满足”,以便能够使用条件运算符来替代 if
语句。您也可以在此处使用任何其他数值,但 0
是最易读的值,这表示它没有其他用途。
在示例中展示用法:
#include <stdio.h>
int main (void)
{
int a, b, c = 4;
a = 2;
b = 2;
a == b ? c++ : 0;
printf("%d",c);
return 0;
}
c
的输出将是 5
,因为 a == b
。
注意a == b ? i++ : 0
在使用f.e时是不一样的。在像 f.e.:
int c = a == b ? i++ : 0;
这里 c
要么被 i
赋值,要么被 0
赋值,取决于 a == b
是否为真。如果 a == b
为真,则 c
由 i
赋值。如果a == b
错误,c
由0
赋值。
旁注:
从技术角度来看,?=
被称为“条件运算符”。 条件运算符是三元运算符.
如果您想了解有关条件运算符 ?=
的更多信息,请查看 ISO:IEC 9899:2018 (C18),§6.5.15 -“条件运算符”了解更多信息。
?:
运算符是一个三元 运算符,但它不被称为"ternary",正如这里的某些答案and/or 评论所暗示的那样。它只是运算符的元数,就像 +
是 二元 运算符或 &
是一元运算符一样。如果它有名字的话,那就是 "Conditional Expression"-operator
它不完全等同于 if/else,因为它是第一个条件 value(结果是两个表达式必须具有相同的类型)地方,不是有条件的执行。当然,两种类型都可以强制转换,使它们相等。
对于 OP 所做的事情,我认为更好的选择(如果 if
不得使用):
a == b && i++;
这看起来更合乎逻辑。但当然这是风格问题。