如果三元运算符要求表达式而不是语句,那为什么要编译printf();
? printf();
是表达式还是声明?
答案 0 :(得分:5)
当你调用一个函数(任何函数)时,它就是一个表达式。当您添加终止;
时,将该表达式转换为语句。
实际上,您可以通过单独使用表达式将任何表达式转换为语句,并添加语句终止符;
。例如,所有赋值都是表达式,例如
a = b + c
是一个表达式,但是
a = b + c;
是一个声明。
还应该注意的是,通常所有表达式都会返回"一个值。在赋值表达式的情况下,它返回赋值给的变量的值(因此在上面的示例中,赋值表达式在赋值后返回a
的值) 。这就是你如何将表达链接在一起的方法。在上面的示例中,语句只是丢弃赋值表达式的结果。
返回值的表达式的唯一例外是函数调用表达式,它调用具有void
返回类型的函数。他们没有任何结果,也无法在链式表达中使用。
关于三元表达式,它需要三个子表达式,计算第一个表达式,并使用结果作为布尔值来选择应该评估其他两个表达式中的哪一个。
示例:
a < b ? printf("a < b\n") : printf("a >= b\n");
以上行是声明。该语句包含一个表达式,即三元表达式,该表达式包含三个子表达式(条件和两个函数调用)。
重要的是要知道只评估三元表达式的两个分支中的一个,因此上面的示例不会两次调用printf
,只调用一次。
答案 1 :(得分:0)
加入Joachim的回答:
当您调用函数 printf
时,它本身就是一个表达式,它根据打印的字符数返回一个值。但是,有人可能会丢弃此返回值,并且只对调用printf
的副作用感兴趣,这是为了将数据打印到 stdout 。
当你这样做时
a = b + c;
表示评估子表达式b + c
,然后将其分配给a
,它也是C中的表达式 - 它返回分配给左侧的值; ;
使其成为一个陈述。