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
n它在字符点上添加引线的字符点
printf
只是一个函数
所以它需要多种参数——varags
d
n它回答你的第一个问题: 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