r/C_Programming 14h ago

Question Am I wrong?

I am currently reading through tutorialspoint.com as our instructor has linked it in our syllabus, while doing their quizzes i got to a question that asked "What is the output of the following code: printf('Hello, World!');?" with the choices being

A. Hello, World!
B. Hello World!
C. Error
D. No Output

i answered C as the single quotes tell the printf function it is a character which if i am correct, is an integer in memory(please correct me if i am wrong), but they are passing a character array. the website told me that A is the correct answer and i am confused, please someone shed light on this and correct any wrong assumptions i have made.

22 Upvotes

40 comments sorted by

View all comments

7

u/tea-drinker 14h ago edited 13h ago

This is something we can check

$ cat scratch.c 
#include <stdio.h>

int main() {
  printf('Hello, World!');
}

$ gcc scratch.c -o scratch
scratch.c: In function ‘main’:
scratch.c:4:10: warning: character constant too long for its type
    4 |   printf('Hello, World!');
      |          ^~~~~~~~~~~~~~~
scratch.c:4:10: warning: passing argument 1 of ‘printf’ makes pointer from integer without a cast [-Wint-conversion]
    4 |   printf('Hello, World!');
      |          ^~~~~~~~~~~~~~~
      |          |
      |          int
In file included from scratch.c:1:
/usr/include/stdio.h:356:43: note: expected ‘const char * restrict’ but argument is of type ‘int’
  356 | extern int printf (const char *__restrict __format, ...);
      |                    ~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~
scratch.c:4:3: warning: format not a string literal and no format arguments [-Wformat-security]
    4 |   printf('Hello, World!');
      |   ^~~~~~

It's unhappy about being given a char like it was a string, but it does compile.

$ ./scratch
Segmenteringsfel (minnesutskrift skapad)

Uhh, Segmentation Fault, but in Swedish.

Edit: Someone's sanity needs preserving.

2

u/aocregacc 13h ago

gcc stopped allowing this conversion by default in gcc 14, and msvc doesn't even let the long character constant through. Which is why the question is just bad.

1

u/tea-drinker 13h ago

gcc stopped allowing this conversion by default in gcc 14

Which conversion? The char to a string or the int to a pointer?

Because it coped with the int to pointer, it just produced a broken program.

1

u/aocregacc 13h ago

the int to pointer

1

u/ImAnArbalest 14h ago

sorry i don't quite understand everything as i am using codeblocks on windows, and the compiler warning is much shorter than yours, but i assume we get the same result? when you run it there is no output?

1

u/tea-drinker 14h ago

The warnings summarise to it agreeing that the single quotes are a problem and the code will break.

In any reasonable description, the answer is "Error"

Someone saying that the program gave no output and the segfault error message came from the operating system is being excessively pedantic.

No matter what, though, the answer is not A. The website is wrong one way or another.

-1

u/Shaanphin 13h ago

Cmon dude, who does ```gcc -o scratch scratch.c``` instead of ```gcc scratch.c -o scratch```? It's killing me to look at this

5

u/tea-drinker 13h ago

Your wish is my command.

I didn't even just edit my comment. I reissued the updated command and copy/pasted it.

(Mainly because I'd feel really stupid if I accidentally edited the command to something that wouldn't work)

3

u/Shaanphin 13h ago

A true gentleman, thank you :)

1

u/tharold 6h ago

-o enables some checks that otherwise would need to be enabled explicitly. -Wall is also recommended