#include <stdio.h>
int main()
{
int a = "Hi";
char b = 'F';
int c = a + b;
printf("%d",a); /* (1) */
printf("%d",c); /* (2) */
}
Run Code Online (Sandbox Code Playgroud)
为什么指令(1)的输出是18537?它是如何以ANSI标准存储值的
指令(2)很清楚,因为我们基本上增加了70到18537,它给出了18607
有人可以根据字符串详细说明值是如何存储在整数变量中的吗?
编译器警告胜利!
$ cc -Wall -Wextra e.c
e.c: In function ‘main’:
e.c:4:13: warning: initialization makes integer from pointer without a cast [-Wint-conversion]
int a = "Hi";
^~~~
Run Code Online (Sandbox Code Playgroud)
您将字符串文字的内存地址分配给变量a.好吧,在很多情况下你会这样做.但是,这不能保证,并且存在潜在的问题.例如,a int可能不足以容纳整个地址.
值得指出的是,这不是有效的C代码,所以不要这样做.根据https://port70.net/~nsz/c/c11/n1570.html#6.5.16.1p1(感谢@Lundin提供链接):
以下其中一项应持有:112)
- 左操作数具有原子,限定或非限定算术类型,右边有算术类型;
- 左操作数具有与右侧类型兼容的结构或联合类型的原子,限定或非限定版本;
- 左操作数具有原子,限定或非限定指针类型,并且(考虑左值操作数在左值转换后将具有的类型)两个操作数都是指向兼容类型的限定或非限定版本的指针,左侧指向的类型具有全部右边指出的那种限定词;
- 左操作数具有原子,限定或非限定指针类型,并且(考虑左值操作数在左值转换后将具有的类型)一个操作数是指向对象类型的指针,另一个是指向合格或非限定版本的指针void,左边指向的类型具有右边指向的所有类型的限定符;
- 左操作数是一个原子,限定或非限定指针,右边是一个空指针常量; 要么
- 左操作数的类型为atomic,qualified或nonqualified _Bool,右边是指针.
int a = "Hi"; 是无效的C代码,并推测它在非标准编译器上可能做什么并不是很有意义.
该代码违反了简单赋值6.5.16.1的规则.没有强制char*转换int,您无法隐式分配.
(如果要阻止在gcc编译器上编译无效的C代码,请使用-std=c11 -pedantic-errors.)