我是编程的初学者。 代码确实被编译但打印出值不可理解的值。 当我通过声明额外的整数将这些值放在外部“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;
}
答案 0 :(得分:2)
运营商优先级存在问题。三元运算符的优先级非常低,仅高于赋值运算符,复合赋值运算符和逗号运算符。因此,你的循环条件
i<=(num1>num2)?num1:num2
相当于
(i<=(num1>num2))?num1:num2
。该表达式将始终评估为num1
或num2
的值,因此除非其中一个为零,否则您的循环将永远不会终止。这也解释了为什么在预先计算三元表达式时观察到不同的行为。
你想要这个:
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;
因此,表达式始终评估为num1
或num2
之一。如果它们都非零,那么循环将永远持续。
你真正想要的是:
i <= (num1 > num2 ? num1 : num2)
答案 4 :(得分:-2)
etrtra ;
就是问题所在。这意味着什么也不做。忽略了作为第四个语句的i ++。
无论如何,for语句中的复杂表达式使得代码更难以被人类阅读(同时具有负面的性能效果)。