Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ if(var=';x';)这样的语句中存储的文本在哪里?_C++_C_Syntax - Fatal编程技术网

C++ if(var=';x';)这样的语句中存储的文本在哪里?

C++ if(var=';x';)这样的语句中存储的文本在哪里?,c++,c,syntax,C++,C,Syntax,这样说 char var; if( var == 'x'); 我们是否首先为“x”分配内存 如果是,它是哪一个(堆栈/数据) 谢谢 值“x”可以作为比较指令的一部分直接存储在代码段中,也可以存储在代码段中用于立即加载到寄存器,或者存储在数据段中用于间接加载或比较。这取决于编译器。几乎每一个针对有能力的体系结构(16位及以上)的编译器都会在CPU指令中设置“x”的常量以进行比较: cmp r0, #'x' 能力较差的体系结构倾向于将这些常量放在常量内存中的一个表中,或者加载它进行比较,或者

这样说

char var;

if( var == 'x');
我们是否首先为“x”分配内存

如果是,它是哪一个(堆栈/数据)


谢谢

值“x”可以作为比较指令的一部分直接存储在代码段中,也可以存储在代码段中用于立即加载到寄存器,或者存储在数据段中用于间接加载或比较。这取决于编译器。

几乎每一个针对有能力的体系结构(16位及以上)的编译器都会在CPU指令中设置“x”的常量以进行比较:

cmp  r0, #'x'

能力较差的体系结构倾向于将这些常量放在常量内存中的一个表中,或者加载它进行比较,或者直接从内存进行比较。

对于安装的GCC副本所针对的任何体系结构,这里有一种技术可以回答类似的问题。使用
-S
标志获取适合代码片段的程序集源文件。或者,使用
-Wa,-al
获取一个汇编列表,其中显示汇编程序生成的实际字节。比如说,

int foo(char var) {
    if (var == 'x')
        return 42;
    return 17;
}
在我的Windows PC上使用
gcc-c-Wa,-al
编译以生成

GAS LISTING C:\DOCUME~1\Ross\LOCALS~1\Temp/ccyDNLLe.s page 1 1 .file "q3715034.c" 2 .text 3 .p2align 4,,15 4 .globl _foo 5 .def _foo; .scl 2; .type 32; .endef 6 _foo: 7 0000 55 pushl %ebp 8 0001 31C0 xorl %eax, %eax 9 0003 89E5 movl %esp, %ebp 10 0005 807D0878 cmpb $120, 8(%ebp) 11 0009 5D popl %ebp 12 000a 0F94C0 sete %al 13 000d 48 decl %eax 14 000e 83E0E7 andl $-25, %eax 15 0011 83C02A addl $42, %eax 16 0014 C3909090 ret 16 90909090 16 90909090 气体清单C:\DOCUME~1\Ross\LOCALS~1\Temp/ccyDNLLe.s第1页 1.文件“q3715034.c” 2.文本 3.P24,,15 4.环球富 5.def_foo。症状自评量表2。32型; 恩德夫先生 6(吴富): 7 0000 55%推力ebp 80001 31C0 xorl%eax,%eax 9 0003 89E5移动百分比esp,%ebp 10 0005 807D0878 cmpb$120,8(%ebp) 11009 5D popl%ebp 12000A 0F94C0组分%al 13000d 48 decl%eax 14000E 83E0E7和L$-25%,eax 15 0011 83C02A附加42美元,eax% 16 0014 C3909090 ret 16 90909090 16 90909090
管路7和9是功能入口锅炉板的所有剩余部分,管路11和16是功能出口锅炉板。第8行将整个返回值寄存器清除为0。第10行是实际比较
var='x'
,您可以在
cmpb$120,8(%ebp)
指令中看到幻数
$120
'x'
的ASCII码是120十进制或0x78十六进制。您可以在偏移量8处的.text段中看到0x78,它作为CMPB指令的一部分存储在该段中。正文的其余部分实现了从我的示例片段中选择返回值,如果比较结果为真,则利用SETE指令使
AL
为1,否则为0。其余的指令分别为DECL、
和L
,然后根据整个
EAX
寄存器中
AL
寄存器的初始值生成17或42,该寄存器存储了该体系结构中整数函数的返回值。

Anthony回答了实际问题。让我从更语言理论的角度来评论这个问题。C++标准定义文字是RValk表达式,但字符串字符除外,这些字符是数组的LValm表达式。C++标准对对象是什么概念有明确的概念。基本上,对象是具有地址的对象类型(int、double、MyClass等)。但标量类型的纯右值,如
char
double
不被视为对象。它们只是值,不引用内存位置。这包括像
'x'
3.14
这样的文字


编译器存储这些值的方式和位置超出了标准的范围。它甚至不需要直接存储它们。例如,像
x*8
这样的表达式可以转换为汇编代码,将x的值向左移动三位。

您是指“x”而不是“b”吗?是的,Jon,很抱歉键入了:-)鉴于您已经很好地列举了各种可能性,我将插入另一个:寄存器。“x”的ASCII值可以(由编译器)知道,由于一些先前执行的代码,它可以方便地存在于寄存器中,或者通过这种预先存在的状态的增量、xor等生成。问题似乎集中在是否可能涉及动态内存分配,甚至可能是数据空间中的静态内存。OP似乎并不关心标准或语言规范。