出于学习的目的,我编写了以下代码片段:
for(int i=0;i<10;i++)
{
for(int j = 0;j<5;j++)
{
//(i==j && i==3)? (goto found) : printf("stya here\n");
if(i==j && i==3){goto found;} else {printf("stay here\n");}
}
}
found:
printf("yes I am here");
但是我想知道当我发现内部循环中省略的语句没有给出错误时,现在我对if-else并不总是可以用?:
操作符替换感到困惑。事实是什么呢?为什么带注解的语句会给予错误?
5条答案
按热度按时间c2e8gylq1#
?:
运算符不能替代if
。它仅适用于表达式:condition ? expr1 : expr2
,其中两个子表达式expr1
和expr2
具有相同的类型(并且整个表达式具有相同的类型)。goto
不是表达式,而是语句。lyr7nygr2#
我不太精通C语言,无法解释为什么这在语法上不起作用,但在意图的意义上?:三元运算符形式旨在作为条件表达式(产生结果),而不是作为控制流机制。使用if语句,您可以为变量选择值或更改应用程序的流。例如
或
三进制仅用于第二种情况,作为条件表达式,即
tyky79it3#
实际上,如果你的编译器支持扩展Statement Expressions,那么你试图用后藤和三元运算符做的事情是可能的,正如它的名字所说,这个扩展允许你在表达式或子表达式中编写语句,就像这样:
使用这些语句可能非常有用(主要用于优化宏),但往往会导致非常脏的代码,就像我给出的例子一样:)
所以为了补充其他的答案,我会说在C99/11中没有扩展是不可能的,但是大多数最近的编译器支持一堆扩展,允许你做非标准的很酷的事情。
fsi0uk1n4#
“后藤found”表达式的结果是什么?我不知道,编译器也不知道,所以
?
表达式的结果无法确定,因此出现错误。vfh0ocws5#
通常,
?:
运算符不能替代经典的if() ... else() ...
。如果两个运算符(和条件)都是返回值的值或表达式,则可以这样使用。不能将它们用于goto
、break
或continue
等语句。以下是可能的:
但是你不能包含任何不是表达式的东西(即没有任何东西没有某种价值或结果):
最后这些例子是可以完成的,但它们需要你使用
if()
或函数bodys来调用: