出于学习目的,我编写了以下代码片段:
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并不总是可以用?:
运算符替换。这是什么事实?为什么评论语句会出错?
答案 0 :(得分:9)
?:
运算符不能替代if
。它仅适用于表达式:condition ? expr1 : expr2
,其中子表达式expr1
和expr2
具有相同的类型(并且整个表达式具有相同的类型)。
goto
不是表达式,而是声明。
答案 1 :(得分:2)
我在C语言中不够精通解释为什么这在语法上不起作用,但在意图意义上,?:三元运算符形式旨在作为条件表达式(产生结果),而不是作为控制流程机制。使用if语句,您可以为变量选择值或更改应用程序的流。 例如
//Change flow
if(x ==0)
{
//do this
}
else
{
//goto some label
}
或
//Change value
if(x == 0)
{
y = 1;
}
else
{
y = 2;
}
三元仅用于第二种情况,作为条件表达式 即
y = (x ==0) ? 1 :2;
答案 2 :(得分:1)
“goto found”表达的结果是什么?我不知道,编译器也没有,因此无法确定?
表达式的结果,因此错误。
答案 3 :(得分:1)
通常,?:
运算符不能代替经典if() ... else() ...
。如果两个运算符(和条件)都是返回值的值或表达式,则可以使用它。您不能将其用于goto
,break
或continue
等语句。
以下是可能的:
condition ? dothis() : dothat(); // there's no assignment, but it's still valid
var = condition ? dothis() : othervar;
condition ? (var=4, othervar=3) : (somevar = 1);
但你不能包含任何不是表达的东西(即没有任何价值或结果):
condition ? continue : break; // statements letting the execution continue somewhere else
condition ? {var = 4; othervar = 3;} : dothat(); // trying to inline scopes/multiple exressions
var = condition ? while(var) {var--;} : 5; // similar, inlining a complete loop
这些最后的例子可以完成,但他们需要你使用if()
或功能体来调用:
if (condition) continue; else break;
condition ? (var = 4, var = 3) : dothat();
var = condition ? dotheloop(var) : 5; // ok, this could be 'var = condition ? 0 : 5;' but... example code
答案 4 :(得分:1)
实际上,如果你的编译器支持扩展名Statement Expressions,你可以用goto和三元运算符做什么,正如它的名字所说,这个扩展允许你在表达式或子表达式中编写语句表达式,就像这样:
(rand() % 2) ? ({goto lbl1;}) : ({goto lbl2;});
使用这些语句非常有用(主要是为了优化宏)但通常会导致代码非常脏,就像我给出的示例一样:)
所以为了补充其他答案,我会说在没有扩展名的C99 / 11中是不可能的,但是大多数最近的编译器支持一堆扩展,允许你做非标准的酷事。