sizeof运算符、strlen()函数和转义字符

本篇文章posted on 2019-12-23 12:58

本人之前写过一篇类似的文章(链接:sizeof运算符和strlen()函数),也比较深入,但是和本篇相比,本篇更加深入。

首先请看下面的代码,这个代码应该输出什么。

下面是C语言代码。

1 #include<stdio.h>
2
3 int main(void)
4 {
5     int a=2,b=0;
6     sizeof(b=a++);
7     printf("a=%d,b=%d\n",a,b);
8     return 0;
9 }

输出结果如下。

a=2,b=0

首先本人需要强调的是,如果没有sizeof运算符,仅仅是b=a++,那么本题相当容易,就是一道普通的C语言题,输出结果自然就是a=3,b=2,但是令人想不明白的是,在这个赋值运算外面加上一个sizeof运算符,竟然会对赋值的效果产生改变,首先这个sizeof运算符的运算结果是4,unsigned int型,没有问题,但是这个结果没有保存起来,所以不用管。现在我们要考虑的问题是,sizeof里面的赋值运算还执行不执行了,按照习惯,给人的感觉好像是C语言的运算符先按优先级再按结合方向依次执行,好像是先++再=再sizeof(这部分如果不能理解可以看我另一篇文章,链接:自增自减与赋值运算),但是需要额外考虑的是sizeof运算符的结果在运行程序前就是已知的了,在编译阶段就算好了,所以里面的赋值根本不执行,尽管里面对变量进行赋值,仍然不被执行。

下面是一个类似的C语言代码。

 1 #include<stdio.h>
 2
 3 int main(void)
 4 {
 5     int a=2;
 6     sizeof(a=3);
 7     sizeof(a+=++a);
 8     printf("a=%d\n",a);
 9     return 0;
10 }

输出结果如下。

a=2

下面是一个和转义字符相结合的C语言代码。

 1 #include<stdio.h>
 2 #include<string.h>
 3
 4 int main(void)
 5 {
 6     char s1[]="\\0\012\028\080\088";
 7     char s2[]="\00\\0\\\018\012\1bc\123\a23\abc\081\088";
 8     printf("strlen(s1):%d\n",strlen(s1));
 9     printf("sizeof(s1):%d\n",sizeof(s1));
10     printf("sizeof(s2):%d\n",sizeof(s2));
11     return 0;
12 }

输出结果如下。

strlen(s1):5
sizeof(s1):12
sizeof(s2):24

本题比较难,因为涉及的知识点比较多。首先提一个简单的知识点,sizeof("\0")的值是2,因为里面有2个字符串结尾标记。

下面本人将s1数组和s2数组的内部分配字符方式展示一下。

char s1[]="\\0\012\028\080\088";

char s2[]="\00\\0\\\018\012\1bc\123\a23\abc\081\088";(背景颜色是一样的,如果觉得不一样那是视觉效果)

本人需要强调的是,‘\0‘确实是字符串结尾标记,几乎所以的C语言教材都是这么描述的,但是当‘\0‘后再跟数字时,可能会拼接成其它字符,所以本人认为,应该用‘\000‘来表示字符串结尾标记。这种风格本人原先是没有的,但经历过上文中的C语言理论题后就产生这种风格了。

原文地址:https://www.cnblogs.com/leisureeen/p/12083165.html

时间: 2024-08-29 16:53:02

sizeof运算符、strlen()函数和转义字符的相关文章

C语言中sizeof、strlen函数的使用

一.测试环境 Win10 + Visual Studio 2017 二.测试代码 #include "pch.h" #include <iostream> #include <string> #include <vector> using namespace std; int main(void) { char a[10] = "hello"; char b[10] = { 'h','e','l','l','o'}; char c

sizeof和strlen函数区别

一.sizeof    sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型.对象.函数等.    它的功能是:获得保证能容纳实现所建立的最大对象的字节大小.    由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小.实际上,用sizeof来返回类型以及静态分配的对象.结构或数组所占的空间,返回值跟对象.结构.数组所存储的内容没有关系.    具体而言,当参数分别如下时,sizeof返回的值表示

C++ sizeof操作符的用法和strlen函数的区别

摘要:本人首先介绍了C++中sizeof操作符的用法和注意事项,其次对比了和strlen的区别和使用,方便大家在写代码的时候查阅,和面试.笔试的时候复习. 目录: sizeof的用法: sizeof和strlen的区别: sizeof的用法: sizeof 是一种单目操作符,而不是函数.sizeof以字节形式给出操作数的存储空间. 操作数可以是一个表达式或在括号内的类型名.操作数的存储空间由操作数的类型决定. char str[]="hello"; char str1[100]; ch

strlen函数与sizeof的区别

1. strlen函数 [原型]: size_t strlen(char const* str); [作用]: strlen 是一个函数,它用来计算指定字符串 str 的长度,但不包括结束字符(即 null 字符) [实例]: char sArr[] = "ILOVEC"; /*用strlen()求长度*/ printf("sArr的长度=%d\n", strlen(sArr)); // 结果:6 [注意]: 函数 strlen 返回的是一个类型为 size_t (

sizeof运算符、malloc函数及free函数

一.sizeof运算符的用法 1.sizeof运算符给出某个类型或变量在内存中所占据的字节数. int a;  sizeof(a)=4;  //sizeof(int)=4; double b;  sizeof(b)=8;  //sizeof(double)=8; 2.数组的sizeof值等于数组所占用的内存总字节数. 如:char a[] = "yes";  sizeof(a);  // 结果为4,字符末尾还存在一个NULL终止符 int a[3];  sizeof(a);  // 结

C++中sizeof操作符与strlen函数

sizeof操作符: sizeof是一个操作符,返回一条表达式或一个类型名字所占的字节数.返回值一个常量表达式,类型为size_t. size_t sizeof(type) size_t sizeof expr 在sizeof的运算对象中解引用一个无效指针仍然是一种安全的行为,因为指针实际上并没有被真正使用,sizeof并不需要真的解引用指针也能知道它所指对象的类型. sizeof对C++的所有内置类型求其所占空间的大小: 环境:win7 64-bits, Code::Blocks 16.01,

strcpy,strlen, strcat, strcmp函数,strlen函数和sizeof的区别

//计算字符串实际长度        //strlen()函数:当遇到'\0'时,计算结束,'\0'不计入长度之内,如果你只定义没有给它赋初值,这个结果是不定的,它会从首地址一直找下去,直到遇到'\0'停止//    char string[] = "I Love You!";//    unsigned long len = strlen(string);//    printf("len = %lu\n", len);  //11//    //    stri

C++Sizeof与Strlen的区别与联系

一.sizeof    sizeof(...)是运算符,在头文件中typedef为unsigned int,其值在编译时即计算好了,参数可以是数组.指针.类型.对象.函数等.    它的功能是:获得保证能容纳实现所建立的最大对象的字节大小.    由于在编译时计算,因此sizeof不能用来返回动态分配的内存空间的大小.实际上,用sizeof来返回类型以及静态分配的对象.结构或数组所占的空间,返回值跟对象.结构.数组所存储的内容没有关系.    具体而言,当参数分别如下时,sizeof返回的值表示

sizeof、strlen、字符串、数组,整到一块,你还清楚吗?

写在前面 sizeof.strlen.字符串.数组,提到这些概念,相信学过C语言的人都能耳熟能详,也能谈得头头是道,但是,在实际运用中,当这些内容交织在一起时,大家却不一定能搞地清清楚楚,本文的目的正是帮助大家将相关知识总结清楚. 正文 先看一段代码 1 #include <stdio.h> 2 #include <stdlib.h> 3 4 void testchar(char str[]) 5 { 6 printf("%d %d\n", sizeof(str