GVKun编程网logo

在 if 语句中初始化的变量的范围是什么?(在 if 语句中初始化的变量的范围是什么)

21

本文将分享在if语句中初始化的变量的范围是什么?的详细内容,并且还将对在if语句中初始化的变量的范围是什么进行详尽解释,此外,我们还将为大家带来关于android–在kotlin中初始化类变量的正确位

本文将分享在 if 语句中初始化的变量的范围是什么?的详细内容,并且还将对在 if 语句中初始化的变量的范围是什么进行详尽解释,此外,我们还将为大家带来关于android – 在kotlin中初始化类变量的正确位置是什么、c – 在类构造函数中声明的变量范围是什么?、c – 扩展在if / else序列中初始化的变量的范围、c – 类静态变量初始化的规则是什么?的相关知识,希望对你有所帮助。

本文目录一览:

在 if 语句中初始化的变量的范围是什么?(在 if 语句中初始化的变量的范围是什么)

在 if 语句中初始化的变量的范围是什么?(在 if 语句中初始化的变量的范围是什么)

我是 Python 新手,所以这可能是一个简单的范围界定问题。Python文件(模块)中的以下代码让我有些困惑:

if __name__ == ''__main__'':    x = 1print x

在我使用过的其他语言中,此代码会引发异常,因为x变量是if语句的本地变量,不应存在于它之外。但是这段代码执行,并打印出
1。谁能解释这种行为?模块中创建的所有变量是否对整个模块都是全局的/可用的?

答案1

小编典典

Python 变量的作用域是分配它们的最里面的函数、类或模块。if像和块这样的控制块while不算在内,因此在 an
内分配的变量if仍然作用于函数、类或模块。

(由生成器表达式或 list/set/dict 理解定义的隐式函数 确实 很重要,lambda
表达式也是如此。您不能将赋值语句填充到其中的任何一个中,但 lambda 参数和for子句目标是隐式赋值。)

android – 在kotlin中初始化类变量的正确位置是什么

android – 在kotlin中初始化类变量的正确位置是什么

答:初始化init块中的类变量

private class ViewHolder(view: View) {
    val menuImg: ImageView
    val txtMenu: TextView

    init {
        menuImg = view.find(R.id.menuImg)
        txtMenu = view.find(R.id.txtMenu)
    }
}

B:在类块中直接初始化类变量

 private class ViewHolder(view: View) {
    val menuImg: ImageView = view.find(R.id.menuImg)
    val txtMenu: TextView =  view.find(R.id.txtMenu)
}

两个代码之间有什么不同?为什么?

解决方法:

这些选项A和B的执行没有区别:
属性初始值设定项(立即分配值)和初始化程序块(使用init块).但是对于像代码这样的简单初始化,通常在您的情况下使用Property初始化程序 – 选项B.

但是如果在代码中使用这两个版本,请注意初始化程序的执行顺序.

引自this article:

First, default constructor arguments are evaluated, starting with
argument to the constructor you call directly, followed by arguments
to any delegated constructors. Next, initializers (property
initializers and init blocks) are executed in the order that they are
defined in the class, top-to-bottom
. Finally, constructors are
executed, starting with the primary constructor and moving outward
through delegated constructors until the constructor that you called
is executed.

c – 在类构造函数中声明的变量范围是什么?

c – 在类构造函数中声明的变量范围是什么?

我很好奇,在类构造函数中声明的变量范围是什么,它们不是该类的数据成员?

例如,如果构造函数需要迭代int i,那么在构造函数完成后是否会销毁此变量,或者它是否为程序的全局变量?

解决方法

从这个意义上讲,构造函数就像任何其他函数一样 – 任何在里面声明的变量都有通常的范围限制,并且它们肯定会超出范围并在构造函数完成后被销毁.

c – 扩展在if / else序列中初始化的变量的范围

c – 扩展在if / else序列中初始化的变量的范围

我正在编写一段代码,我希望根据条件使用不同的类构造函数.到目前为止,我已经使用if和else语句来构造对象,但实例被“捕获”在括号中,不能在代码中进一步使用.

这是代码中的样子:

if (my_boolean){
    MyClass my_object(arg1); //calling a first constructor
}
else {
    MyClass my_object(arg1,arg2); //calling another constructor
}
//more code using my_object

到目前为止,我尝试使用static关键字但没有成功.是否存在有条件地使用不同构造函数而不必重新定义构造函数的常用方法?

解决方法

尝试以下:)

MyClass my_object = my_boolean ? MyClass(arg1) : MyClass(arg1,arg2);

考虑到即使该类没有默认构造函数,此代码也能正常工作.

这是一个示范性的例子

#include <iostream> 
#include <cstdlib>
#include <ctime>

int main () 
{
    struct Point
    {
        Point( int x ) : x( x ) {}
        Point( int x,int y ) : x( x ),y( y ) {}
        int x = 0;
        int y = 0;
    };

    std::srand( ( unsigned )std::time( 0 ) );

    Point p = std::rand() % 2 ? Point( 1 ) : Point( 1,2 );

    std::cout << "p.x = " << p.x << ",p.y = " << p.y << std::endl;  

    return 0; 
}

我得到了以下输出

p.x = 1,p.y = 2

你得到了什么输出?

总结

以上是小编为你收集整理的c – 扩展在if / else序列中初始化的变量的范围全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

c – 类静态变量初始化的规则是什么?

c – 类静态变量初始化的规则是什么?

我有一些遗留代码,我需要为消息添加一个新类(这与我的问题无关).但事实证明,我需要声明一个空构造函数,以便初始化一些静态.不是默认构造函数或编译器提供的,而是用户定义的空.我试图将代码减少到MWE,在这里得到的结果是:

#include <iostream>

using namespace std;

struct Test
{
    test() {cout << "Test::test()" << "\n";}
    void dummy(){}
};

template<typename T>
struct Message
{
    Message()
    {
        test.dummy(); // this call have to be here in order to initialize Test,but why?
    }

    static Test test;
};

template<typename T>
Test Message<T>::test;

struct A : public Message<A>
{
    //A(){} // uncomment this (and comment the default one) to call the Test constructor
    A() = default;
};

int main()
{
}

这就是发生的事情:

>程序本身是空的,即没有创建实例.
> A类有一个CRTP,这似乎对这个例子至关重要.
> A的基数有一个静态声明,我期待它的构造函数被调用.
>对函数进行虚拟调用,什么都不做,但也很关键.

问题是如果我不提供自定义构造函数,那么静态构造函数永远不会被调用.我无法理解为什么需要这个?与默认或编译器生成的有什么区别?为什么我需要调用虚函数?

我相信这是有规则的.我用不同版本的gcc和clang检查了它 – 行为是一样的.我非常感谢标准/文档的链接.

解决方法

如果你保留一个构造函数默认并且从不调用它,那么就不需要生成它,因此不需要创建测试.如果在定义时显式默认它,请调用A构造函数或访问A :: test,它将被正确初始化.

12.1 Constructors [class.ctor]

7
A default constructor that is defaulted and not defined as deleted is implicitly defined when it is odr-used (3.2) to create an object of its class type (1.8) or when it is explicitly defaulted after its first declaration.

struct A : public Message<A>
{
    A() = default; // no constructor is emitted unless A is instantiated

    A(); // declaration
};

A::A() = default; // explicit default deFinition

int
main()
{
    A a; // instantiation
    A::test; // just explicitly access test so it is initialized regardless of A constructor
}

关于在 if 语句中初始化的变量的范围是什么?在 if 语句中初始化的变量的范围是什么的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于android – 在kotlin中初始化类变量的正确位置是什么、c – 在类构造函数中声明的变量范围是什么?、c – 扩展在if / else序列中初始化的变量的范围、c – 类静态变量初始化的规则是什么?的相关知识,请在本站寻找。

本文标签: