首页 > 试题广场 >

在C++语言中,下列说法正确的是:

[单选题]
在C++语言中,下列说法正确的是:
  • 编译器会将inline修饰的函数的函数体直接插入到调用此函数的地方,以此加快程序的运行速度
  • 局部变量和全局变量不能重名
  • 静态局部变量内存是在运行期分配的,存储在静态区
  • C++不是类型安全的语言
推荐
首先,可以排除B和C。B选项,因为局部变量和全局变量是可以重名的,而且一般来说在某个函数体内,局部变量是会覆盖全局变量的。C选项,静态局部变量存在静态存储区,而局部变量存储在堆栈区,确切的说是栈区。再看A选项,内联函数与其他普通函数的区别是,内联函数在生成可执行文件时,其代码块是直接嵌入到调用处的,以此减少函数调用的开销提高程序性能,它与宏很类似。但是,C++ primer 上明明白白的写过这么一句话:内联说明(inline specification)对于编译器来说只是一个建议,编译器可以选择忽略这个建议。也就是说,是否以嵌入式方式存在,是由编译器决定的,并不是一定。最后看D选项,什么叫类型安全的语言?本人很浅陋的认识是:就C++而言,我们可以把0作为false,非零作为true。一个函数就算是bool类型的,我们还是可以返回int类型,并且自动把0转化成false,非零转化成true。相比之下java不能把int类型转化成bool类型。所以java是一种类型安全的语言,而C++并不是。 答案选D
编辑于 2015-12-10 11:54:16 回复(7)
D。
A,如果内联函数定义在调用函数的后面,则编译器会将其当作普通函数调用来看,并不会直接插入到调用处。
B,可以重名。
C,局部全局变量存储在全局区,而不是堆栈区。
发表于 2015-08-13 14:08:01 回复(0)
针对内联函数(以下语句来自C++ primer 5th):
内联说明只是向编译器发出的一个请求,编译器可以选择忽略这个请求。
一般来说,内联机制用于优化规模较小、流程直接、频繁调用的函数。
发表于 2015-12-09 16:53:33 回复(0)
C的错误不应该是在运行时分配吗?实际是在编译时静态变量就分配至全局区(static区),静态全局变量和静态局部变量全都是放在静态区的;
  1. 全局变量在整个工程文件内都有效;静态全局变量只在定义它的文件内有效;
  2. 静态局部变量只在定义它的函数内有效,只是程序仅分配一次内存, 函数返回后,该变量不会消失;
  3. 局部变量在定义它的函数内有效,但是函数返回 后失效。  
我是这么理解的,看其他观点都在分析分配区域问题,有点疑惑
发表于 2022-11-21 16:58:10 回复(0)
内联函数的优缺点: 优点: (1)通过避免函数的回调,加速了程序的执行; (2) 通过利用指令缓存,增强局部访问性; (3)使用内联可以替换重复的短代码,方便代码管理; 缺点: (1) 由于是替换展开,因此会增大代码体量;  (2)一旦修改内联,所有用到该内联的地方都需要重新编译; 自我理解:内联函数就类似于“函数的宏定义“,当然内联和宏也有区别。 (1)内联函数可调试,而宏定义不行; (2)内联函数首先是函数,函数的很多性质都适用于内联函数,如:内联函数可以重载;编译器会对内联函数的参数类型做安全检查或自动类型转换(同普通函数),而宏定义则不会; (3)内联函数可以访问类的私有成员变量,宏定义则不能。
发表于 2019-02-18 12:41:05 回复(0)
选择D:
有过C++开发经验的人会发现,我们可以将0作为false,非零作为true。一个函数即使是bool类型的,但是我们还是可以返回int类型的,并且自动将0转换成false,非零转换成true。
发表于 2015-09-07 00:30:14 回复(0)
堆栈区是栈区,局部变量
堆区:程序员自己申请分配,malloc、new
全局区:全局变量、static
常量区
代码区
编辑于 2017-09-04 16:29:41 回复(0)
选项A涉及到了内联函数(inline function)。首先我们要明白内联函数提出的原因及意义。下面使用c++primer中文版第四版(P221)中的例子详细解释一下。
//定义了查找更短字符串的函数
const string &shortString(const string &s1,const string &s2)
{
return s1.size<s2.size()?s1:s2;
}
我们可以看到我们将查找更短字符串的操作定义了一个函数,这样做有很多的好处:
①更易于单身狗程序猿的理解;
②如果要修改,直接修改函数,不用修改所有的等价表达式,真是一本万利啊!
③使用函数确保每个调用实例能够统一;
④可以重复调用,代码重用,貌似和2一样啊;
你看,写成函数有这么多的好处,多好啊!但是,还是有缺点的:调用函数比直接用等价表达式要慢很多。调用等价表达式,直接编译代码一些列工作就行了。但是改成函数就不一样了,包括:调用前要先保存寄存器,并在返回时恢复;复制实参;程序还必须mov转到一个新的位置执行。你看,改成函数你好理解了,但是机器累到了。因此,就提出了内联函数,这样做就有好处:内联函数避免了函数调用的开销。将函数设置成内联函数就是将它在程序中的每个调用点上“内联”的展开。
cout<<shortString(s1,s2)<<endl;
那么编译是直接展开为:
cout<<( s1.size<s2.size()?s1:s2 )<<endl;
看起来不错,但是吧,编译器也很有脾气,内联函数对于编译器来说只是一个建议,编译器可以选择忽略,还是调用函数。你说它是不是很贱,不听老人言,非要吃力不讨好。貌似答案中提到,内联函数太长就忽略了。还有一点,内联函数需要在头文件中定义,这个跟一般的函数定义不同。
选项B,局部和全局可以重名。这个不解释了。
选项C, 静态局部变量存在静态存储区,而局部变量存储在堆栈区,确切的说是栈区。(这部分我得补一补,不太了解)
选项D,类型安全。我一直觉得c是类型安全的。不过看了评论区有关int和bool的讨论,认同。确实很多时候非0确实是个问题。
发表于 2017-03-01 09:59:24 回复(2)
A的话,若是虚函数之前加上inline关键字,并不会成为内联函数,程序仍然是动态编译的。
编辑于 2015-08-14 18:28:40 回复(2)
 A. 编译器会将inline修饰的函数的函数体直接插入到调用此函数的地方,以此加快程序的运行速度。

在C++中,使用`inline`关键字修饰函数可以建议编译器将函数的定义直接插入到调用它的地方,而不是进行函数调用。这样可以减少函数调用的开销,提高程序的运行速度。然而,编译器是否真正将函数内联化是有一定的自由裁量权的,它可能会根据自己的优化策略和函数的复杂度来决定是否进行内联优化。
但内联函数对编译器来说是一种建议,可执行替换,可不执行替换

B. 局部变量和全局变量可以重名。在C++中,允许在不同的作用域中声明同名的变量,但它们具有不同的作用域和可见性。

在C语言中,局部变量和全局变量可以重名,但是它们的作用域不同,具体如下:

  1. 局部变量:

    • 局部变量是在函数内部定义的变量,只能在函数内部使用。
    • 如果在一个函数内部同时存在一个局部变量和一个全局变量同名时,在函数内部使用该名称时,优先使用局部变量。
  2. 全局变量:

    • 全局变量是在函数外部定义或声明的变量,可以在程序的任何地方使用。
    • 如果在一个函数内部同时存在一个局部变量和一个全局变量同名时,在函数内部使用该名称时,优先使用局部变量;而在函数外部使用该名称时,则使用全局变量。

实际上,为了避免出现变量重名的情况,最好在编程过程中采用一些规范的命名方式,例如为全局变量添加一些前缀以区分其作用域。


C. 静态局部变量内存是在编译期分配的,存储在静态数据区(静态存储区),而不是在运行期分配的。静态局部变量在程序执行时只会初始化一次,并且在函数调用结束后仍然保留其值。

D.

C++在某些情况下存在类型模糊性,这可能导致一些类型安全性问题。

在C++中,可以将0视为false,非零值视为true。这意味着即使函数被声明为返回bool类型,实际上它仍然可以返回int类型,并且0会被自动转换为false,非零值会被自动转换为true。

这种类型模糊性会导致一些潜在的问题,如错误地使用bool类型的返回值,或者在条件语句中使用整数值而不是明确的bool值。这样的代码可能会导致逻辑错误或行为不一致。

尽管C++在某些情况下存在类型模糊性,但它仍然提供了一些强类型检查的机制,如编译时类型检查和显式的类型转换。通过遵循最佳实践并避免类型模糊性的使用,可以增强C++的类型安全性。


发表于 2023-10-30 17:09:48 回复(0)
D 不同类型之间可以强制转换或发生隐式类型转换,不是类型安全的 A 编译器可以拒绝inline
发表于 2022-01-14 13:07:14 回复(0)
内联函数对编译器来说是一种建议,可执行替换,可不执行替换
发表于 2018-03-09 09:28:29 回复(0)
内联函数,对编译器来说,只是一个建议,具体是否以嵌入式方式,由编译器来选择。
发表于 2017-09-24 21:37:14 回复(0)
静态局部变量在编译期分配的内存
发表于 2023-10-13 10:35:15 回复(0)
inline是一种建议而非要求
发表于 2023-09-16 18:36:23 回复(0)
有大神能解释下吗,C 为什么错了
发表于 2022-01-26 11:29:00 回复(2)
局部变量和全局变量可以重名,在局部代码段中,局部变量可以对全局变量进行覆盖。
发表于 2020-08-07 16:06:26 回复(0)
在C++中,内存分成5个区,他们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。

1.栈,就是那些由编译器在需要的时候分配,在不需要的时候自动清楚的变量的存储区。里面的变量通常是局部变量、函数参数等

2.堆,就是那些由new分配的内存块,他们的释放编译器不去管,由用户的应用程序去控制,一般一个new就要对应一个delete。如果程序员没有释放掉,那么在程序结束后,操作系统会自动回收。

3.自由存储区,就是那些由malloc等分配的内存块,它和堆是十分相似的,不过它是用free来结束自己的生命的。

4.全局/静态存储区,全局变量和静态变量被分配到同一块内存中,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区

5.常量存储区,这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改。
发表于 2019-08-07 21:40:59 回复(0)
C++不是类型安全的语言
发表于 2016-10-06 01:47:52 回复(0)
C/C++里面有指针,而指针在使用和引用的时候,很容易出错。而Java就没有指针。C/C++不是类型安全的
发表于 2015-12-10 17:36:22 回复(0)
A
B:  因为局部变量和全局变量是可以重名的,而且一般来说在某个函数体内,局部变量是会覆盖全局变量的。
C: 静态局部变量存在静态存储区,而局部变量存储在堆栈区,确切的说是栈区
D
发表于 2015-11-03 17:29:17 回复(0)