在“for”中使用三元运算符

时间:2018-01-17 15:31:47

标签: c for-loop ternary

我是编程的初学者。 代码确实被编译但打印出值不可理解的值。 当我通过声明额外的整数将这些值放在外部“for”中并使用它们时,代码似乎正常工作。下面的代码有什么问题?谢谢!

#include <stdio.h>

int main( int argc, char** argv ) {
    int num1, num2, i, j, k;
    printf( "Enter the two Integers: " );
    scanf( "%d%d", &num1, &num2 );
    for ( i = (num1 < num2) ? num1 : num2; i <= (num1 > num2) ?num1 : num2; ; i++ ) {
        for ( j = 1; j <= 9; j++ ) {
            printf( "%d x %d = %-2d", i, j, i*j );
        }
        printf( "\n" );
    }
    return EXIT_SUCCESS;
}

5 个答案:

答案 0 :(得分:2)

运营商优先级存在问题。三元运算符的优先级非常低,仅高于赋值运算符,复合赋值运算符和逗号运算符。因此,你的循环条件

i<=(num1>num2)?num1:num2

相当于

(i<=(num1>num2))?num1:num2

。该表达式将始终评估为num1num2的值,因此除非其中一个为零,否则您的循环将永远不会终止。这也解释了为什么在预先计算三元表达式时观察到不同的行为。

你想要这个:

for(i = ((num1 < num2) ? num1 : num2);
        i <= ((num1 > num2) ? num1 : num2); i++) {

但实际上,我建议首先进行预计算。代码稍长,但更清晰。

答案 1 :(得分:2)

对于初学者来说,for语句中有一个拼写错误

for(i=(num1<num2)?num1:num2;i<=(num1>num2)?num1:num2;; i++)
                                                   ^^^^ 

有一个冗余分号。

根据C标准,条件运算符的定义方式如下

conditional-expression:
    logical-OR-expression ? expression : conditional-expression

相对于此表达式

i<=(num1>num2)?num1:num2

然后它被解释为

( i<=(num1>num2) ) ? num1 : num2

很明显,你的意思是

i <= (num1 > num2 ? num1 : num2 )

然而,在循环之前使用一个if语句比在循环中使用条件运算符更好。

考虑到在任何情况下第一个循环都是不安全的,因为用户可以输入等于INT_MAX的值。在这种情况下,程序将具有未定义的行为。使用do-while循环更好,更安全。

同样,对于乘法结果,最好使用类型long long int

程序可以按以下方式查看

#include <stdio.h>

int main(void)
{
    int num1 = 0, num2 = 0;

    printf( "Enter two Integers: " );

    scanf( "%d%d", &num1, &num2 );

    if ( num2 < num1 )
    {
        int tmp = num1;
        num1 = num2;
        num2 = tmp;
    }

    int i = num1;
    do
    {
        for ( int j = 1; j < 10; j++ )
        {
            printf( "%d x %d = %-2lld\n", i, j, ( long long int )i * j );
        }
        printf("\n");
    } while ( i++ != num2 );

    return 0;
}

它的输出可能看起来像

Enter two Integers: 1 5
1 x 1 = 1 
1 x 2 = 2 
1 x 3 = 3 
1 x 4 = 4 
1 x 5 = 5 
1 x 6 = 6 
1 x 7 = 7 
1 x 8 = 8 
1 x 9 = 9 

2 x 1 = 2 
2 x 2 = 4 
2 x 3 = 6 
2 x 4 = 8 
2 x 5 = 10
2 x 6 = 12
2 x 7 = 14
2 x 8 = 16
2 x 9 = 18

3 x 1 = 3 
3 x 2 = 6 
3 x 3 = 9 
3 x 4 = 12
3 x 5 = 15
3 x 6 = 18
3 x 7 = 21
3 x 8 = 24
3 x 9 = 27

4 x 1 = 4 
4 x 2 = 8 
4 x 3 = 12
4 x 4 = 16
4 x 5 = 20
4 x 6 = 24
4 x 7 = 28
4 x 8 = 32
4 x 9 = 36

5 x 1 = 5 
5 x 2 = 10
5 x 3 = 15
5 x 4 = 20
5 x 5 = 25
5 x 6 = 30
5 x 7 = 35
5 x 8 = 40
5 x 9 = 45

答案 2 :(得分:1)

您的奇怪结果归因于operator precedence,三位运算符是在将i与(num1&gt; num2)进行比较后执行的。所以当你写

i<=(num1>num2)?num1:num2;

你实际上是在写像

这样的东西
(i<=(num1>num2))?num1:num2;

因此条件依赖于num1或num2的值。只需在三元运算符周围添加括号,就可以了。

答案 3 :(得分:0)

i<=(num1>num2)?num1:num2中,<=的优先级高于? :。所以这个表达式相当于:

(i <= (num1 > num2))  ?  num1  :  num2;

因此,表达式始终评估为num1num2之一。如果它们都非零,那么循环将永远持续。

你真正想要的是:

i <= (num1 > num2 ? num1 : num2)

答案 4 :(得分:-2)

etrtra ;就是问题所在。这意味着什么也不做。忽略了作为第四个语句的i ++。

无论如何,for语句中的复杂表达式使得代码更难以被人类阅读(同时具有负面的性能效果)。