我坚持这个C程序,并想知道你是否可以给我一些帮助。
问题1:
#include <stdio.h>
#include <conio.h>
void main()
{
clrsec();
int a,b,c;
a=(90,88);
b=4,17;
printf("the value of \n a=%d \n b=%d");
getch();
}
这是程序,我没有得到概念,代码的输出在下面给出
O/p- a=4
b=88
问题2:
#include <stdio.h>
#include <conio.h>
void main()
{
clrsec();
int a,b,c;
a=90,88;
b=4,17;
printf("the value of \n a=%d \n b=%d");
getch();
}
这是程序,我不明白这个概念,下面给出了代码的输出。
O/p- a=4
b=90
答案 0 :(得分:3)
这些printf
语句需要两个参数:
printf("the value of \n a=%d \n b=%d");
缺少参数意味着您的代码具有未定义的行为。这反过来意味着任何结果都是可能的。你不能指望任何特定的结果。考虑到这一点,问题的结果是可能的。
明显的解决方法是将参数传递给printf
调用:
printf("the value of \n a=%d \n b=%d", a, b);
一旦修复,问题就会变得有趣。答案是它涉及逗号运算符,它计算其第二个参数并且具有非常低的优先级。在这种情况下:
a=(90,88); // (90, 88) evaluates to 88.
在括号内评估逗号运算符,结果为
a = 88;
在这种情况下
a=90,88;
该语句被解析为
(a=90),88; // whole expression evaluates to 88. Result of evaluation isn't used.
因此为a
分配值90
,整个表达式的计算结果为88
。
答案 1 :(得分:2)
printf("the value of \n a=%d \n b=%d");
假设这是您在代码中获得的内容并获得a = 4
和b=88
那么你所拥有的是未定义的行为。
一旦你在%d
中有格式说明符printf()
,它就会期望下一个参数中的值,如果你没有提供,那么你就有了UB。
任何东西都可以从堆栈中取出并打印出来。我猜你看到4和88这是因为未定义的行为,这里没有什么是棘手的。标准这样说..
为了摆脱这个UB,你需要在第二个agrument中提供匹配值。
printf("the value of \n a=%d \n b=%d",a,b);
如果您有疑问
int a = (90,88);
以及a = 88
@EdHeal (90,88)
已经提到的将被评估,结果是a=88
答案 2 :(得分:2)
我想如果printf
已修复
即
printf("the value of \n a=%d \n b=%d", a, b);
然后问题的概念是运算符的优先级
即
a=(90,88);
首先计算(90,88)(结果= 88)因此a = 88
和
b=4,17;
这里首先计算b = 4然后计算(b = 4),计算17。 17被扔掉了 这里