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
我想得到关于为什么输出不同的解释。
6ojccjat1#
第一个语句将printf的返回值赋给a。printf返回写入的字节数。在本例中为1。在第二个扩展版本中,不对a赋值。下面是一个与原始版本 * 实际 * 等效的版本:
printf
a
int a = 0; if(7>2) { a = printf("6"); } else { a = printf("4"); } printf("%d",a);
8wigbo562#
他们完全不同。要使它们相同,请执行以下操作:
int a = 0 ; if(7>2) { a = printf("6"); } else { a = printf("4"); } printf("%d",a);
guicsvcw3#
cond?val1:val2是三元运算符。它不应该是控制结构(如if、for或while)。它是一个运算符。要构建表达式(有价值的东西)而不是指令Frontier在C语言中比在其他语言中更模糊,因为指令具有值(包括void),而表达式具有潜在的副作用。但是,当你想得到结果的时候,你使用了cond?val1:val2,正如你所做的,因为你把结果赋给了a。这里的结果是printf("6")的结果,也就是1,因为printf返回打印的字符数。注意,这是真实的疑问的,因为即使7小于2,结果仍然是1。因为您打印了该结果,所以在6之后打印1是正常的。(Just为了清楚起见,即使我假设您已经知道了,您所做的也只是打印字符串“6”,然后打印数字1,这是第一次printf的结果。
cond?val1:val2
if
for
while
void
printf("6")
6
1
printf("%d",printf("6"));
它首先打印“6”,然后将结果传递给外部printf,以打印内部printf返回的内容,即1)在第二段代码中,不更改a的值,并且忽略printf的结果。
guykilcj4#
你的例子是不等价的。为了等价,第二个例子应该说a=printf(...无处不在。然后a将被分配打印的字符数,1。
a=printf(...
t98cgbkg5#
条件运算符(e1 ? e2 : e3)* 不是 *“if条件的简短版本”,尽管它与if ... else结构有一些相似之处。条件运算符产生一个 value(在第一个示例中将其赋给a); if ... else构造没有值。因此,第一个示例将一个值赋给a,因为它是以赋值语句的形式编写的;该值是printf函数调用返回的1。要在第二个示例中获得类似的行为,正如其他人所说的,还需要在if ... else块中分配printf返回的值。或者,要使第一种情况像第二种情况一样工作,可以跳过赋值,使用条件运算来确定传递给printf调用的参数:
e1 ? e2 : e3
if ... else
int main(void) { int a = 0; printf(7 > 2 ? "6" : "4"); printf("%d", a); return 0; }
5条答案
按热度按时间6ojccjat1#
第一个语句将
printf
的返回值赋给a
。printf返回写入的字节数。在本例中为1。在第二个扩展版本中,不对a
赋值。下面是一个与原始版本 * 实际 * 等效的版本:8wigbo562#
他们完全不同。
要使它们相同,请执行以下操作:
guicsvcw3#
cond?val1:val2
是三元运算符。它不应该是控制结构(如if
、for
或while
)。它是一个运算符。要构建表达式(有价值的东西)而不是指令Frontier在C语言中比在其他语言中更模糊,因为指令具有值(包括void
),而表达式具有潜在的副作用。但是,当你想得到结果的时候,你使用了
cond?val1:val2
,正如你所做的,因为你把结果赋给了a
。这里的结果是
printf("6")
的结果,也就是1,因为printf
返回打印的字符数。注意,这是真实的疑问的,因为即使7小于2,结果仍然是1。因为您打印了该结果,所以在6
之后打印1
是正常的。(Just为了清楚起见,即使我假设您已经知道了,您所做的也只是打印字符串“6”,然后打印数字1,这是第一次printf的结果。
它首先打印“6”,然后将结果传递给外部printf,以打印内部
printf
返回的内容,即1)在第二段代码中,不更改
a
的值,并且忽略printf
的结果。guykilcj4#
你的例子是不等价的。为了等价,第二个例子应该说
a=printf(...
无处不在。然后a
将被分配打印的字符数,1
。t98cgbkg5#
条件运算符(
e1 ? e2 : e3
)* 不是 *“if条件的简短版本”,尽管它与if ... else
结构有一些相似之处。条件运算符产生一个 value(在第一个示例中将其赋给a
);if ... else
构造没有值。因此,第一个示例将一个值赋给
a
,因为它是以赋值语句的形式编写的;该值是printf
函数调用返回的1
。要在第二个示例中获得类似的行为,正如其他人所说的,还需要在if ... else
块中分配printf
返回的值。或者,要使第一种情况像第二种情况一样工作,可以跳过赋值,使用条件运算来确定传递给
printf
调用的参数: