我没有得到这个C程序的概念

时间:2015-02-01 08:47:56

标签: c

我坚持这个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

3 个答案:

答案 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 = 4b=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被扔掉了 这里