C 在“内部使用三元运算符”;至于;

C 在“内部使用三元运算符”;至于;,c,for-loop,ternary,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

我是编程的初学者。 代码确实会被编译,但会打印出不可理解的值。 当我通过声明额外的整数将这些值放入外部“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;
}
#包括
int main(int argc,字符**argv){
int num1,num2,i,j,k;
printf(“输入两个整数:”);
scanf(“%d%d”、&num1、&num2);
对于(i=(num1对于(j=1;j而言,etrtra
是个问题。它意味着什么都不做。作为第四条语句的i++被忽略


无论如何,for语句中的复杂表达式会使代码在同一时间更难(由人类)读取,并对性能产生负面影响。

etrtra
是问题所在。它意味着什么都不做。忽略作为第四条语句的i++


无论如何,for语句中的复杂表达式会使代码在同一时间更难读取(由人类读取),并对性能产生负面影响。

您奇怪的结果是由于,三元运算符是在将i与(num1>num2)进行比较后执行的。因此,当您编写

i<=(num1>num2)?num1:num2;
inum2)?num1:num2;
你实际上是在写这样的东西

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

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

您奇怪的结果是由于,三元运算符是在将i与(num1>num2)进行比较后执行的。因此,当您编写

i<=(num1>num2)?num1:num2;
inum2)?num1:num2;
你实际上是在写这样的东西

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

因此,条件依赖于num1或num2的值。只需在三元运算符周围添加括号,就可以了。在
inum2>中,num1:num2
inum2>中,num1:num2
运算符优先级有问题。三元运算符的优先级非常低,仅高于赋值运算符,复合赋值运算符和逗号运算符。因此,循环条件

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

但实际上,我首先推荐预计算。代码稍长,但更清晰。

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

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

但实际上,我首先建议使用预计算。代码稍微长一点,但要清楚得多。

对于初学者来说,For语句中有一个输入错误

for(i=(num1<num2)?num1:num2;i<=(num1>num2)?num1:num2;; i++)
                                                   ^^^^ 
相对于这个表达式

i<=(num1>num2)?num1:num2
它的输出可能看起来像

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

首先,For语句中有一个输入错误

for(i=(num1<num2)?num1:num2;i<=(num1>num2)?num1:num2;; i++)
                                                   ^^^^ 
相对于这个表达式

i<=(num1>num2)?num1:num2
它的输出可能看起来像

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

您输入了错误吗?在您的第一个for循环中有两个连续的
。您在问题中发布的代码没有编译,因为
for
语句中有两个
。这也告诉我们您没有完全粘贴您正在使用的代码,因此我们不得不怀疑是否有其他错误。您应该编辑您的问题,以准确显示失败的代码。您还应显示有效的代码,并准确显示导致错误输出的输入。(1)呈现您实际询问的代码。最好将其复制并粘贴到问题中。您呈现的内容不会编译。(2)展示您得到的预期和实际输出。为什么您甚至试图将所有代码塞进
for()中
首先陈述?除非你是,否则没有理由这么做。对阿得洛:是的,我知道这样的代码很难理解,但我只是通过做一些琐碎的修改来尝试,这就是我陷入这个问题的原因:)此外,对于初学者来说,IOCCC是一个很难实现的目标:3你是否会打字?有两个连续的
。您在问题中发布的代码没有编译,因为
for
语句中出现了加倍的
。这也告诉我们您没有完全粘贴您正在使用的代码,因此我们不得不怀疑是否有其他错误。您应该编辑问题,以准确显示失败的代码。Y你还应该展示有效的代码,并且你应该准确地展示你给出的导致错误输出的输入。(1)展示你实际询问的代码。最好是复制并粘贴到问题中。你所展示的不会编译。(2)展示您得到的预期和实际输出。为什么您甚至试图将所有代码塞进
for()中
语句?除非你没有理由这么做。to Adrew:是的,我知道这样的代码很难编写,但我只是在做一些小改动,这就是我遇到这个问题的原因:)此外,对于初学者来说,IOCCC是一个很难达到的目标:3额外的
会阻止编译。它不会导致程序“[打印]输出不可理解的值”正如问题所报告的。因此,这不是问题的原因。OP发布的代码必须与导致问题的代码不同,这需要在提供答案之前进行澄清。对不起,这是我第一次发布问题,因此我犯了一个可怕的错误!我会更清楚地正确发布代码。因此rry.额外的
将阻止编译。它不会导致程序“[打印]输出不可理解的值”正如问题报告所述。因此,这不是问题的原因。OP发布的代码必须与导致问题的代码不同,并且在提供答案之前需要进行澄清。对不起,这是我第一次发布问题,因此我犯了一个可怕的错误!我会更加注意正确发布cod
#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