C 需要了解printf的行为

C 需要了解printf的行为,c,C,(一) 输出::我看到你了 char* fun() { return "awake"; } int main() { printf("%s",fun()+ printf("I see you")); return 0; } 输出::运行时崩溃 1) 为什么这两种情况都是不同的行为 2) 有人能解释为什么第一个PRINTF中没有打印“awake”吗 3) 场景1是否取决于编译器?此 int main() { printf("%s",5+printf("I see you"));

(一)

输出::我看到你了

char* fun()
{
  return "awake";
}
int main()
{
  printf("%s",fun()+ printf("I see you"));
  return 0;
}
输出::运行时崩溃

1) 为什么这两种情况都是不同的行为

2) 有人能解释为什么第一个PRINTF中没有打印“awake”吗

3) 场景1是否取决于编译器?

int main()
{
  printf("%s",5+printf("I see you"));
  return 0;
}
fun()
(您的
“唤醒”
字符串文字的地址)的结果添加到调用
printf()
的结果中,该结果是整数值
9
,即打印的字符数。这是一个字符地址加上一个整数偏移量-完全合法-它恰好是
“我看到你”
字符串文字中的几个字符,因此它会打印出“我看到你”字符串的结尾

这个


尝试将虚拟内存地址
14
处的任何内容打印为以NUL结尾的字符串,该地址甚至可能未映射到进程地址空间。

为什么您希望两者具有相同的行为?@Marged No,我不这么认为。它是一个字符串文字。@juanchopanza但函数返回的字符串被忽略。@ameyCU不,它不是。它被用在一个表达式中。@juanchopanza似乎我的c有点生锈了;-)
  printf("%s",fun()+ printf("I see you"));
  printf("%s",5+printf("I see you"));