为什么将字符串传递给 scanf() 在 C 中可以正常编译?

Why passing string to scanf() compiles fine in C?

我最近写了一个简单的程序,我错误地使用 scanf() 而不是 printf() 在控制台上显示消息。我原以为会出现编译时错误,但它编译得很好,没有警告和运行时崩溃。我知道 scanf() 用于从键盘获取输入。我应该不会在下面的程序中出错吗?

#include <stdio.h>
int main()
{
    scanf("Hello world");   // oops, It had to be printf()
    return 0;
}

它是否调用了未定义的行为(UB)? C标准中有没有提到这个?为什么在编译时不检查是否将正确和有效的参数传递给 scanf() 函数?

scanf does take a string paramater。这就是它编译正常的原因,但看起来您的参数与预期不匹配,因此它在运行时崩溃(或只是退出)。

编译器无法读懂你的想法。

printf("Hello world")scanf("Hello world") 都是合式的。

代码运行正常。事实上,scanf 被声明为

int scanf(const char *format, ...);

幸运的是,您的 format 不包含任何 %,在 ... 中没有对应关系,这将调用 UB。
此外,format 是一个字符串文字,它允许编译器通过它确保您传递了关于格式说明符的正确类型的参数,作为启用更高警告级别的健全性检查的一部分。 (-Wformat 系列)

将字符串传递给 scanf 可以正常编译,因为 scanf 期望 将字符串作为第一个参数。有关详细的 scanf 描述,请参阅文档或编程手册。