C语言 为什么if条件的短版本与其扩展版本的输出不同?

cczfrluj  于 2022-12-11  发布在  其他
关注(0)|答案(5)|浏览(120)
int a = 0;
a = 7 > 2 ? printf("6") : printf("4");
printf ("%d",a);

此块的输出为:

61

我尝试了扩展形式的代码

int a = 0  ;
    if(7>2)
    {
        printf("6");
    }
    else
    {
        printf("4");
    }
    printf("%d",a);

此处的输出为:

60

我想得到关于为什么输出不同的解释。

6ojccjat

6ojccjat1#

第一个语句将printf的返回值赋给a。printf返回写入的字节数。在本例中为1。在第二个扩展版本中,不对a赋值。下面是一个与原始版本 * 实际 * 等效的版本:

int a = 0;
if(7>2)
{
    a = printf("6");
}
else
{
    a = printf("4");
}
printf("%d",a);
8wigbo56

8wigbo562#

他们完全不同。
要使它们相同,请执行以下操作:

int a = 0  ;
    if(7>2)
    {
        a = printf("6");
    }
    else
    {
        a = printf("4");
    }
    printf("%d",a);
guicsvcw

guicsvcw3#

cond?val1:val2是三元运算符。它不应该是控制结构(如ifforwhile)。它是一个运算符。要构建表达式(有价值的东西)而不是指令Frontier在C语言中比在其他语言中更模糊,因为指令具有值(包括void),而表达式具有潜在的副作用。
但是,当你想得到结果的时候,你使用了cond?val1:val2,正如你所做的,因为你把结果赋给了a
这里的结果是printf("6")的结果,也就是1,因为printf返回打印的字符数。注意,这是真实的疑问的,因为即使7小于2,结果仍然是1。因为您打印了该结果,所以在6之后打印1是正常的。
(Just为了清楚起见,即使我假设您已经知道了,您所做的也只是打印字符串“6”,然后打印数字1,这是第一次printf的结果。

printf("%d",printf("6"));

它首先打印“6”,然后将结果传递给外部printf,以打印内部printf返回的内容,即1)
在第二段代码中,不更改a的值,并且忽略printf的结果。

guykilcj

guykilcj4#

你的例子是不等价的。为了等价,第二个例子应该说a=printf(...无处不在。然后a将被分配打印的字符数,1

t98cgbkg

t98cgbkg5#

条件运算符(e1 ? e2 : e3)* 不是 *“if条件的简短版本”,尽管它与if ... else结构有一些相似之处。条件运算符产生一个 value(在第一个示例中将其赋给a); if ... else构造没有值。
因此,第一个示例将一个值赋给a,因为它是以赋值语句的形式编写的;该值是printf函数调用返回的1。要在第二个示例中获得类似的行为,正如其他人所说的,还需要在if ... else块中分配printf返回的值。
或者,要使第一种情况像第二种情况一样工作,可以跳过赋值,使用条件运算来确定传递给printf调用的参数:

int main(void)
{
    int a = 0;
    printf(7 > 2 ? "6" : "4");
    printf("%d", a);
    return 0;
}

相关问题