转到不使用?:C中的运算符

出于学习目的,我编写了以下代码片段:

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并不总是可以用?:运算符替换。 这是什么事实? 为什么评论语句会出错?

?:运算符不能替换if 。 它只适用于表达式: condition ? expr1 : expr2 condition ? expr1 : expr2其中子表达式expr1expr2的类型相同(整个表达式的类型相同)。

goto不是表达式,它是一个声明。

我在C语言中不够精通,无法解释为什么它在语法上不起作用,但在意图意义上,?:三元运算符forms旨在作为条件表达式(产生结果),而不是作为控制流机制。 使用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; 

“goto found”表达的结果是什么? 我不知道,编译器也没有,所以结果如何? 表达式无法确定,因此错误。

通常, ?:运算符不能替代经典的if() ... else() ... 如果两个运算符(和条件)都是返回值的值或表达式,则可以使用它。 您不能将它们用于gotobreakcontinuegoto

以下是可能的:

 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 

实际上,如果您的编译器支持扩展语句表达式 ,那么您尝试使用goto和三元运算符是可能的,正如其名称所述,此扩展允许您在表达式或子表达式中编写语句,如下所示:

 (rand() % 2) ? ({goto lbl1;}) : ({goto lbl2;}); 

使用这些语句非常有用(主要是为了优化宏)但通常会导致非常脏的代码,就像我给出的示例:)

所以为了补充其他答案,我会说在C99 / 11中没有扩展是不可能的,但是大多数最近的编译器支持一堆扩展,允许你做非标准的酷事。