C 不理解printf()的奇怪行为

C 不理解printf()的奇怪行为,c,C,我发现一个问题,询问以下语句的输出: printf("%d"+1,123); 给出的答案是d,它的解释是:因为“%d”是一个字符串,+1在这里表示d 123只是被忽略了。 我的第一个问题是:为什么123会被忽略 我还发表了以下声明 printf("%d"+2,123); 它什么也没印。代码运行但没有错误。 我的第二个问题是:为什么代码编译时没有错误 第三次,我做了以下工作: printf("%d"+0,123); 输出为123。 所以我真的很困惑。如果+1打印d,那么+0不应该打印%?想象

我发现一个问题,询问以下语句的输出:

printf("%d"+1,123);
给出的答案是
d
,它的解释是:因为
“%d”
是一个字符串,+1在这里表示
d

123
只是被忽略了。 我的第一个问题是:为什么
123
会被忽略

我还发表了以下声明

printf("%d"+2,123);
它什么也没印。代码运行但没有错误。 我的第二个问题是:为什么代码编译时没有错误

第三次,我做了以下工作:

printf("%d"+0,123);
输出为
123
。 所以我真的很困惑。如果+1打印
d
,那么+0不应该打印
%

想象一个字符串:

char str[] = "%d";
现在我们知道:

str[0] == '%'
str[1] == 'd'
str[2] == '\0' = 0x00
str+2 == &str[2] == the address of the byte 0x00 inside the str string == ""
printf("%d", 123); is the same as printf(str, 123)
printf("%d" + 2, 123); if the same as printf("", 123); and it will print "", ie. nothing
想象一个字符串:

char str[] = "%d";
现在我们知道:

str[0] == '%'
str[1] == 'd'
str[2] == '\0' = 0x00
str+2 == &str[2] == the address of the byte 0x00 inside the str string == ""
printf("%d", 123); is the same as printf(str, 123)
printf("%d" + 2, 123); if the same as printf("", 123); and it will print "", ie. nothing

在字符点上添加引线的字符点

printf
只是一个函数

所以它需要多种参数——varags

  • “%d”+1将是一个字符串,仅
    d
    n它

  • “%d”+2-将是空字节-无

  • “%d”+0-将为%d-因此预期输出-请参阅手册页


  • 在字符点上添加引线的字符点

    printf
    只是一个函数

    所以它需要多种参数——varags

  • “%d”+1将是一个字符串,仅
    d
    n它

  • “%d”+2-将是空字节-无

  • “%d”+0-将为%d-因此预期输出-请参阅手册页


  • 回答你的第一个问题: 123被忽略,因为在写入printf(“%d”+1123)时,+1将指针放在%d(即d)的索引1处。因为,要打印123,我们需要指针位于%d并访问%d,而不仅仅是d。因此,在这种情况下,只有d被打印出来

    回答你的第二个问题 它编译时没有错误,因为printf()只是一个函数,它接受各种参数。有关printf()的更多详细信息,请访问

    在第三种情况下,即printf(“%d”+0123),输出是123,因为这里指针的位置是0,即%并且我们可以访问%d。因此,我们得到123作为输出


    希望这对您有所帮助。

    回答您的第一个问题: 123被忽略,因为在写入printf(“%d”+1123)时,+1将指针放在%d(即d)的索引1处。因为,要打印123,我们需要指针位于%d并访问%d,而不仅仅是d。因此,在这种情况下,只有d被打印出来

    回答你的第二个问题 它编译时没有错误,因为printf()只是一个函数,它接受各种参数。有关printf()的更多详细信息,请访问

    在第三种情况下,即printf(“%d”+0123),输出是123,因为这里指针的位置是0,即%并且我们可以访问%d。因此,我们得到123作为输出


    希望这对您有所帮助。

    printf(“%d”+2123)与printf(“,123)相同。该格式不需要的额外参数将被忽略。如果您真的不熟悉C,您应该知道字符串文字是作为
    char
    数组实现的。在表达式中使用数组时,编译器将数组视为指向第一个元素的指针。因此,
    +2
    将指针向前移动2个字符。在C语言中,字符串使用“以null结尾”的表示形式,这意味着字符串在遇到
    \0
    字符时结束,因此
    %d
    实际上是数组
    {“%”、'd'、'\0'}
    。当指针向前移动2个字符时,实际上是指向
    {'\0'}
    部分,这是一个没有字符的字符串。因此,没有输出。那么,为什么+0没有打印%?
    +0
    根本不会移动指针,因此它与您没有添加它完全相同。
    printf
    的第一个参数是“格式说明符”。它告诉
    printf
    如何处理以下所有参数<代码>%d
    表示“将相应的整数参数打印为带符号的十进制”。有很多选择:例如,
    %X
    指示
    printf
    将相应的整数参数打印为十六进制数字,使用大写字母表示数字A-F。一个示例是我刚刚删除了一条不正确的注释。我不确定你是怎么把它打印出来的
    printf
    将信任您的格式说明符,您告诉它您正在传递一个整数(通过
    %d
    ),但没有传递。这将给你未定义的行为。当您遇到C规范允许未定义的情况时,您可能会得到随机或任意行为…这取决于编译器和运行库作者的实现选择。
    printf(“%d”+2123)与printf(“,123)相同。该格式不需要的额外参数将被忽略。如果您真的不熟悉C,您应该知道字符串文字是作为
    char
    数组实现的。在表达式中使用数组时,编译器将数组视为指向第一个元素的指针。因此,
    +2
    将指针向前移动2个字符。在C语言中,字符串使用“以null结尾”的表示形式,这意味着字符串在遇到
    \0
    字符时结束,因此
    %d
    实际上是数组
    {“%”、'd'、'\0'}
    。当指针向前移动2个字符时,实际上是指向
    {'\0'}
    部分,这是一个没有字符的字符串。因此,没有输出。那么,为什么+0没有打印%?
    +0
    根本不会移动指针,因此它与您没有添加它完全相同。
    printf
    的第一个参数是“格式说明符”。它告诉
    printf
    如何处理以下所有参数<代码>%d
    表示“将相应的整数参数打印为带符号的十进制”。有许多替代方法:例如,
    %X
    指示
    printf
    将相应的整数参数打印为十六进制数字,使用大写字母表示数字A-F