我是C语言的新手,在练习中,我必须编写以下代码部分的输出,即3
。但是我不明白为什么会这样。
int main() {
char st[100]="efgh";
printf ("\n%ld\n",&st[3]-st);
return 0;
}
答案 0 :(得分:5)
在表达式中使用数组时,除非它是&
或sizeof
的参数,否则它将求值为第一个元素的地址。
因此,&st[3] - st
的计算结果为&st[3] - &st[0]
,这仅仅是指针运算:两个数组元素的地址之间的差就是它们的索引之间的差,即3 - 0
,它得出{ {1}}。
唯一的问题是结果的类型为3
,但是ptrdiff_t
printf
需要%ld
。如果您的计算机上的这些类型不同,则无法使用。在printf()
格式的字符串中,long int
的正确长度修饰符是ptrdiff_t
-使用t
。
答案 1 :(得分:3)
根据定义,import org.apache.spark.sql.expressions.Window
val win =Window.orderBy("date_differnece")
val df= Seq(("FT1" ,"17-06-2019"), ("FT2" ,"19-06-2019"), ("FT3" ,"23-06-2019"),( "FT4", "25-06-2019"),("FT5", "27-06-2019")).toDF("flight", "dt")
val df1= df.withColumn("date_differnece", abs(datediff(current_date,to_date($"dt", "dd-MM-yyyy"))))
df1.select($"*", min($"date_differnece").over(win).as("nearest_flight")).where($"nearest_flight"===$"date_differnece").select($"dt")
+----------+
| dt|
+----------+
|17-06-2019|
+----------+
与&st[3]
相同。 st+3
是st+3-st
。 (该表达式中的3
从数组衰减为指针。为便于携带,从技术上说,printf格式字符串应具有st
而不是%td
。)