【发布时间】:2017-11-18 08:15:07
【问题描述】:
免责声明:此问题询问 "str literal" + "str literal" 的工作原理
'a' + 'b' 或 '9' - '0' = 9 ('character' + 'character') 的工作原理:
问题:
对C语言比较熟悉的各位,感谢阅读
(用clang编译,标准=C11)
示例:
(尝试在没有
".c"扩展名的情况下打印__FILE__)
printf("%s\n", __FILE__);返回filename.c
printf("%.*s\n", (int)(".c" - __FILE__), __FILE__);返回filename1. C如何将字符串/字符串文字类型转换为int?是否忽略空格?
(int)"string"的值代表什么?另一个例子:
(int)("word" - "rd") = 6273 (int)("rd" - "word") = -6273 (int)("word" - " rd") = -5 (int)(" rd" - "word") = -5为什么
(int)(".c" - __FILE__)甚至可以工作?
3. 上面的printf 函数真的有效吗?
4. 有没有等价于 'a' + 1 = 'b' 的字符串?
提前谢谢各位!
无关猜测:
1
为什么(int)(".c" - __FILE__) 甚至可以工作?
猜测
some value of (first?) pointer to ".c"
- some value of (first?) pointer to __FILE__ string literal
2.(int)"string"的值究竟代表什么?
- 为什么
(int)(".c" - __FILE__)甚至可以工作?
idk 但这是另一个例子:
printf("%i", (int)".c");
printf("%i", (int)__FILE__);
printf("%i", (int)(".c" - __FILE__));
printf("%i", (int)(__FILE__ - ".c"));
printf("%./*i", (int)(".c" - __FILE__), (int)__FILE__);
printf("%./*i", (int)(".c" - __FILE__), (int)("c" - __FILE__));
output
---------------------
(int) ".c"= 4357629
(int) __FILE__= 4357620
(int) (".c" - __FILE__) : 9
(int) (__FILE__ - ".c"): -9
(int with precision specified) __FILE__ : 004357620
(int with precision specified) (".c" - __FILE__): 000000009
$
3.printf 真的有效吗?
假设确实如此,可能:
printf("%.*s",(int)(".c" - __FILE__), __FILE__)
width = (int)(".c" - __FILE__)
specifier/str = __FILE__
printf 将__FILE__ 打印为宽度为(".c" - __FILE__) 的字符串(少两个字符)
【问题讨论】:
-
字符串是一个字符数组。在大多数情况下,当数组用作左值时,它会转换为指向第一个元素的指针。将指针转换为
int是实现定义的,但通常它只是将指针的地址作为整数返回。 -
哦,所以
(int)"string"和(base 10) &(str[0])说的一样? -
到处都是未定义的行为。甚至没有为不在同一个数组中的对象定义指针算法。实际上,运行时可能会因违反范围检查而中止
-
另外,在问题中,您说问题是关于“
"str" + "str"的工作原理”——不,不是,"str" + "str"根本不起作用(试一试)。跨度>
标签: c string character string-literals integer-arithmetic